Menu
CoddyTech

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 terbang

Di 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.

challenge icon

Tantangan

Mudah

Seorang ksatria tidak mewarisi senjata: ksatria memiliki senjata dan dapat menggantinya. Buat kedua class.

  • Weapon menyimpan weapon_name dan damage, keduanya ditetapkan oleh konstruktor: Weapon.new("Sword", 7).
  • Knight menyimpan knight_name (dari konstruktor) dan sebuah senjata, yang bernilai null pada awalnya.
  • equip(new_weapon) mengganti senjata dan drop() mengatur nilainya kembali menjadi null.
  • attack() mengembalikan Ada attacks with Sword for 7 damage, menggunakan nama ksatria serta nama dan damage senjatanya, atau Ada has no weapon jika 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 weapon

Tulis 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())
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online