Menu
CoddyTech

Soyut Sınıflar ve Metotlar

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

Bazı sınıflar yalnızca genişletilmek için vardır. Her şeklin bir alanı vardır, ancak şeklin bir daire mi yoksa dikdörtgen mi olduğunu bilene kadar bu alanı hesaplayamazsın. Böyle bir sınıfı @abstract olarak, class_name satırının üstündeki satırda işaretle:

# shape.gd
@abstract
class_name Shape
extends RefCounted

@abstract func area() -> float
@abstract func perimeter() -> float

func describe() -> String:
	return "Area %.1f, perimeter %.1f" % [area(), perimeter()]

Bir @abstract func imzaya sahiptir ve gövdesi yoktur: iki nokta yoktur ve ardından kod gelmez. Her alt sınıfın bu metodu sağlaması gerektiğini belirtir. describe() normal bir metottur; alt sınıflar bu metodu devralır ve bu metot soyut metotları zaten çağırabilir.

Bir soyut sınıfın nesnesini oluşturamazsın. Shape.new(), program başlamadan önce Parse Error: Cannot construct abstract class "Shape". hatasıyla programı durdurur.

Tüm soyut metotları yazan bir alt sınıf normal bir sınıftır:

# rectangle.gd
class_name Rectangle
extends Shape

var width: float
var height: float

func _init(w: float, h: float) -> void:
	width = w
	height = h

func area() -> float:
	return width * height

func perimeter() -> float:
	return 2 * (width + height)
var rect := Rectangle.new(4.0, 6.0)
print(rect.describe())
Area 24.0, perimeter 20.0

Bir alt sınıf bunlardan birini atladığında Godot, programı çalıştırmadan önce bunu bildirir: Class "Square" must implement "Shape.perimeter()" and other inherited abstract methods or be marked as "@abstract". Böylece oluşturabileceğin her nesnede area() ve perimeter() bulunur.

Bir soyut sınıf yine de değişkenlere ve bir _init() yöntemine sahip olabilir. Alt sınıflar, her zamanki gibi super() ile onu çağırır.

challenge icon

Görev

Kolay

Bir mağaza iki ödeme yöntemini kabul eder. Her ödemenin bir tutarı ve makbuzu vardır, ancak ücret ve ad yönteme bağlıdır.

  • PaymentMethod sınıfını soyut yap ve iki soyut yöntem bildir: fee() -> float ve method_name() -> String. Her sayı için iki ondalık basamak kullanarak NAME: paid AMOUNT, fee FEE, total TOTAL döndüren receipt() yöntemini yaz (toplam, tutar ile ücretin toplamıdır).
  • CreditCard: ücret tutarın %3'üdür (amount * 0.03) ve ad Credit card olur.
  • BankTransfer: ücret 1.5'tir; tutar 100 veya daha fazlaysa 0.0 olur ve ad Bank transfer olur.

Alt sınıflar PaymentMethod sınıfının kurucusunu kullanır. Sağlanan kod, ardından kaç ödeme geleceğini okur ve her ödeme için bir satır okur: card AMOUNT veya transfer AMOUNT. Her makbuzu ve ücretlerin toplamını yazdırır. card 50 ve transfer 120 için şunu yazdırır:

Credit card: paid 50.00, fee 1.50, total 51.50
Bank transfer: paid 120.00, fee 0.00, total 120.00
Total fees: 1.50

Kodunu payment_method.gd, credit_card.gd ve bank_transfer.gd dosyalarına yaz. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
	var count := int(OS.read_string_from_stdin())
	var total_fees := 0.0
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		var payment: PaymentMethod
		if p[0] == "card":
			payment = CreditCard.new(float(p[1]))
		else:
			payment = BankTransfer.new(float(p[1]))
		print(payment.receipt())
		total_fees += payment.fee()
	print("Total fees: %.2f" % total_fees)
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