Komposisi vs Pewarisan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 40 dari 65.
Class menggunakan kembali kode dengan dua cara. Inheritance (extends) menyatakan bahwa sebuah class adalah jenis dari class lain: Mage adalah Player. Composition menyatakan bahwa sebuah class memiliki bagian: class tersebut menyimpan object lain dalam variabel anggota dan menyerahkan pekerjaan kepadanya:
# motor.gd
class_name Motor
extends RefCounted
func start() -> String:
return "motor running"
# car.gd
class_name Car
extends RefCounted
var motor := Motor.new()
func start() -> String:
return "Car starts, " + motor.start()Car.new().start() mengembalikan Car starts, motor running. Mobil tidak tahu cara kerja motor: mobil memanggil motor.start(). Meneruskan pemanggilan ke bagian seperti ini disebut delegasi. (Class ini bernama Motor karena Engine sudah menjadi class Godot.)
Komposisi memberikan manfaat saat bagian-bagian berubah atau digabungkan. Dengan pewarisan, karakter yang berjalan dan karakter yang terbang adalah dua subclass, dan kelelawar yang mulai terbang tidak bisa mengubah class-nya. Dengan komposisi, karakter memiliki bagian gerakan, dan menggantinya hanya memerlukan satu assignment:
# character.gd
class_name Character
extends RefCounted
var char_name: String
var movement: Movement
func _init(new_name: String, new_movement: Movement) -> void:
char_name = new_name
movement = new_movement
func move() -> String:
return char_name + " " + movement.move()
# main.gd
var bat := Character.new("Bat", Walk.new())
print(bat.move()) # Bat berjalan
bat.movement = Fly.new()
print(bat.move()) # Bat terbangDi sini, Walk dan Fly memperluas class kecil Movement: kedua teknik ini bekerja bersama. Class GDScript hanya dapat extend satu class, jadi komposisi juga menjadi cara agar satu object memiliki beberapa kemampuan, dengan menyimpan beberapa bagian.
Gunakan pewarisan untuk hubungan "adalah" yang nyata dan tidak pernah berubah. Gunakan komposisi ketika class "memiliki" sesuatu, atau ketika bagiannya harus dapat diganti saat game berjalan.
Tantangan
MudahSeorang ksatria tidak mewarisi senjata: ksatria memiliki senjata dan dapat menggantinya. Buat kedua class.
Weaponmenyimpanweapon_namedandamage, keduanya ditetapkan oleh konstruktor:Weapon.new("Sword", 7).Knightmenyimpanknight_name(dari konstruktor) dan sebuah senjata, yang bernilainullpada awalnya.equip(new_weapon)mengganti senjata dandrop()mengatur nilainya kembali menjadinull.attack()mengembalikanAda attacks with Sword for 7 damage, menggunakan nama ksatria serta nama dan damage senjatanya, atauAda has no weaponjika tidak ada senjata.
Kode yang disediakan membaca nama ksatria dan jumlah perintah berikutnya (equip Sword 7, drop, attack), lalu menjalankannya. Untuk Ada dan attack, equip Sword 7, attack, equip Axe 12, attack, drop, attack, kode ini mencetak:
Ada has no weapon
Equipped Sword
Ada attacks with Sword for 7 damage
Equipped Axe
Ada attacks with Axe for 12 damage
Dropped the weapon
Ada has no weaponTulis kodemu di weapon.gd dan knight.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
var knight := Knight.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "equip":
knight.equip(Weapon.new(parts[1], int(parts[2])))
print("Equipped ", parts[1])
elif parts[0] == "drop":
knight.drop()
print("Dropped the weapon")
else:
print(knight.attack())
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online