Menu
CoddyTech

Composition ve Inheritance Karşılaştırması

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 40 / 65.

Sınıflar kodu iki şekilde yeniden kullanır. Kalıtım (extends), bir sınıfın başka bir sınıfın türü olduğunu belirtir: bir Mage, bir Player'dır. Bileşim ise bir sınıfın bir parçaya sahip olduğunu belirtir: başka bir nesneyi üye değişkende saklar ve işi ona devreder:

# 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() Car starts, motor running değerini döndürür. Araba motorun nasıl çalıştığını bilmez: motor.start() çağrısını yapar. Bir çağrıyı bu şekilde bir parçaya devretmeye delegasyon denir. (Sınıfa Motor adı verilir çünkü Engine zaten bir Godot sınıfıdır.)

Parçalar değiştiğinde veya bir araya geldiğinde bileşim işe yarar. Kalıtımda, yürüyen bir karakter ve uçan bir karakter iki alt sınıftır ve uçmaya başlayan bir yarasa sınıfını değiştiremez. Bileşimde karakterin bir hareket parçası vardır ve bunu değiştirmek tek bir atamadır:

# 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 yürür
bat.movement = Fly.new()
print(bat.move()) # Bat uçar

Burada Walk ve Fly küçük bir Movement sınıfını genişletir: bu iki teknik birlikte çalışır. Bir GDScript sınıfı yalnızca bir sınıfı extend edebilir; bu nedenle bileşim, bir nesnenin birkaç parçayı bünyesinde barındırarak birden fazla yetenek kazanmasının da bir yoludur.

Asla değişmeyen gerçek bir “bir türüdür” ilişkisi için kalıtım kullan. Sınıfın bir şeye “sahip olduğu” durumlarda veya parça oyun çalışırken değiştirilmek zorundaysa bileşim kullan.

challenge icon

Görev

Kolay

Bir şövalye bir silahtan miras almaz: şövalyenin bir silahı vardır ve onu değiştirebilir. Her iki sınıfı da oluştur.

  • Weapon, ikisi de kurucu tarafından ayarlanan weapon_name ve damage değerlerini saklar: Weapon.new("Sword", 7).
  • Knight, kurucudan gelen knight_name değerini ve başlangıçta null olan bir silahı saklar.
  • equip(new_weapon) silahı değiştirir ve drop() onu tekrar null olarak ayarlar.
  • attack(), şövalyenin adını ve silahın adını ve hasarını kullanarak Ada attacks with Sword for 7 damage değerini döndürür; silah yoksa Ada has no weapon değerini döndürür.

Verilen kod, şövalyenin adını ve ardından kaç komutun geleceğini okur (equip Sword 7, drop, attack) ve bunları çalıştırır. Ada ve attack, equip Sword 7, attack, equip Axe 12, attack, drop, attack için şu çıktıyı verir:

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

Kodunu weapon.gd ve knight.gd dosyalarına yaz. main.gd, verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi