Menu
CoddyTech

Metot Geçersiz Kılma

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

Bir alt sınıf, aynı ada sahip bir yöntem tanımlayarak bir yöntemi geçersiz kılar. Alt sınıfın nesneleri daha sonra alt sınıfın sürümünü çalıştırır; geçersiz kılmadığı yöntemler ise değiştirilmeden miras alınmaya devam eder.

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n

func make_sound() -> void:
	print("Some generic animal sound")

func info() -> void:
	print("I am ", animal_name)
# dog.gd
class_name Dog
extends Animal

func make_sound() -> void:
	print("Woof! Woof!")
var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()
Some generic animal sound
Woof! Woof!
I am Buddy

Üzerine yazılan yöntem, üst sınıfın imzasını korumalıdır: aynı parametreler ve aynı dönüş türü. Farklı olursa program başlamaz:

# animal.gd
func speak(times: int) -> String:
	return "...".repeat(times)
# dog.gd
func speak() -> String:
	return "Woof"
Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".

Üst sınıfın bir metodundan çağrı geldiğinde bile çocuğun sürümü çalışır. Burada introduce() yalnızca Animal içinde bulunur ve Cat tarafından geçersiz kılınan sound() metodunu çağırır:

# animal.gd
func sound() -> String:
	return "..."

func introduce() -> String:
	return animal_name + " says " + sound()
# cat.gd
func sound() -> String:
	return "Meow"
print(Cat.new("Tom").introduce())
Tom says Meow

Değişkenlerin üzerine yazılamaz: Dog içinde var animal_name ifadesini yeniden tanımlamak bir ayrıştırma hatasıdır (The member "animal_name" already exists in parent class Animal). Bir alt sınıfa farklı bir başlangıç değeri vermek için bunu alt sınıfın _init() metodunda atayın.

challenge icon

Görev

Kolay

shape.gd, tamamlanmış Shape sınıfını içerir: bir color, 0.0 döndüren area() ve describe(). Circle ve Square bu sınıfı genişletir ve kurucuları zaten vardır. Her birinde iki yöntemi geçersiz kılın:

  • Circle: area(), PI * radius * radius döndürür ve describe(), This is a COLOR circle with radius R döndürür.
  • Square: area(), side * side döndürür ve describe(), This is a COLOR square with side S döndürür.

Ebeveyn sınıfın imzalarını koruyun: func area() -> float ve func describe() -> String.

Sağlanan kod, ardından kaç şeklin geleceğini okur; sonra her şekil için bir satır okur: shape COLOR, circle COLOR RADIUS veya square COLOR SIDE. describe() sonucunu ve alanı iki ondalık basamakla yazdırır. circle red 5 ve shape green için şu çıktıyı verir:

This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00

Kodunuzu circle.gd ve square.gd dosyalarına yazın. main.gd, sağlanan 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 count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var shape: Shape
		if parts[0] == "circle":
			shape = Circle.new(parts[1], int(parts[2]))
		elif parts[0] == "square":
			shape = Square.new(parts[1], int(parts[2]))
		else:
			shape = Shape.new(parts[1])
		print(shape.describe())
		print("Area: %.2f" % shape.area())
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