Catene di ereditarietà
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 18 di 65.
Una classe figlia può essere a sua volta una classe genitore. Ogni extends aggiunge un livello alla catena di ereditarietà:
# vehicle.gd
class_name Vehicle
extends RefCounted
var wheels: int
func _init(w: int) -> void:
wheels = w
func describe() -> String:
return "%d wheels" % wheels# car.gd
class_name Car
extends Vehicle
func _init() -> void:
super(4)
func describe() -> String:
return "Car with " + super()# race_car.gd
class_name RaceCar
extends Car
var top_speed: int
func _init(speed: int) -> void:
super()
top_speed = speed
func describe() -> String:
return super() + ", top speed %d" % top_speedRaceCar ha tutto ciò che proviene da Car e da Vehicle. Ogni super() sale di un livello, quindi una chiamata esegue tutte e tre le versioni di describe():
print(RaceCar.new(300).describe())Car with 4 wheels, top speed 300Quando chiami un metodo o leggi una variabile, Godot cerca prima nella classe dell'oggetto stesso, poi nella classe genitore, poi nella classe genitore della classe genitore e usa la prima che trova. RaceCar.new(300).wheels si trova in Vehicle, due livelli più in alto.
Ogni classe ha esattamente una classe genitore. extends accetta una sola classe e indicarne due genera un errore di analisi:
class_name FlyingCar
extends Car, PlaneParse Error: Expected end of statement after superclass, found "," instead.GDScript non supporta l’ereditarietà multipla. Quando una classe ha bisogno delle funzionalità di due classi, inseriscile in un’unica catena oppure assegnale un oggetto dell’altra classe con cui lavorare (un capitolo successivo approfondisce questo argomento).
Sfida
Facilecharacter.gd contiene la classe Character completa: un nome, hp, describe() che restituisce NAME (HP HP) e attack() che restituisce 1. Costruisci altri due livelli su questa base:
WarriorestendeCharactere aggiungestrength. Il suo costruttore passa il nome e hp asuper().describe()aggiunge, strength Sal testo della classe genitore, eattack()restituisce la forza.KnightestendeWarriore aggiungearmor. Il suo costruttore passa il nome, hp e strength asuper().describe()aggiunge, armor Aal testo diWarrior, eattack()restituisce l'attacco diWarriorpiù5.
Il codice fornito legge quanti personaggi seguono, poi una riga per personaggio: character NAME HP, warrior NAME HP STRENGTH oppure knight NAME HP STRENGTH ARMOR. Stampa describe() e l'attacco. Per knight Arthur 120 15 8 stampa:
Arthur (120 HP), strength 15, armor 8
Attack: 20Il tuo codice va in warrior.gd e knight.gd. main.gd contiene il codice fornito per input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
var count := int(OS.read_string_from_stdin())
for i in count:
var p := OS.read_string_from_stdin().split(" ")
var c: Character
if p[0] == "knight":
c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
elif p[0] == "warrior":
c = Warrior.new(p[1], int(p[2]), int(p[3]))
else:
c = Character.new(p[1], int(p[2]))
print(c.describe())
print("Attack: %d" % c.attack())
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online