Kelas Abstrak dan Method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 23 dari 65.
Beberapa class hanya ada untuk diperluas. Setiap bentuk memiliki luas, tetapi kamu tidak dapat menghitungnya sampai kamu tahu apakah bentuk tersebut lingkaran atau persegi panjang. Tandai class seperti itu dengan @abstract, pada baris di atas class_name:
# 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()]Sebuah @abstract func memiliki signature dan tidak memiliki isi: tidak ada titik dua dan tidak ada kode setelahnya. Ini berarti setiap child harus menyediakan method ini. describe() adalah method biasa. Child mewarisinya, dan method ini sudah dapat memanggil method abstract.
Kamu tidak dapat membuat object dari class abstrak. Shape.new() menghentikan program sebelum dimulai dengan Parse Error: Cannot construct abstract class "Shape".
Child yang menulis setiap method abstrak adalah class biasa:
# 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.0Jika sebuah turunan tidak menyertakan salah satunya, Godot akan melaporkannya sebelum menjalankan program: Class "Square" must implement "Shape.perimeter()" and other inherited abstract methods or be marked as "@abstract". Jadi, setiap object yang bisa kamu buat memiliki area() dan perimeter().
Class abstrak tetap dapat memiliki variabel dan _init(). Class turunan memanggilnya dengan super() seperti biasa.
Tantangan
MudahSebuah toko menerima dua metode pembayaran. Setiap pembayaran memiliki jumlah dan tanda terima, tetapi biaya dan namanya bergantung pada metodenya.
- Buat
PaymentMethodabstrak dan deklarasikan dua method abstrak:fee() -> floatdanmethod_name() -> String. Tulisreceipt(), yang mengembalikanNAME: paid AMOUNT, fee FEE, total TOTALdengan dua angka desimal untuk setiap bilangan (totalnya adalah jumlah ditambah biaya). CreditCard: biayanya 3% dari jumlah (amount * 0.03), dan namanyaCredit card.BankTransfer: biayanya1.5, atau0.0jika jumlahnya100atau lebih, dan namanyaBank transfer.
Class turunan menggunakan konstruktor PaymentMethod. Kode yang disediakan membaca jumlah pembayaran berikutnya, lalu satu baris untuk setiap pembayaran: card AMOUNT atau transfer AMOUNT. Kode itu mencetak setiap tanda terima dan jumlah seluruh biaya. Untuk card 50 dan transfer 120, hasilnya:
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.50Tulis kodemu di payment_method.gd, credit_card.gd, dan bank_transfer.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 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)
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