Cadenas de herencia
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 18 de 65.
Una clase hija puede ser a su vez una clase padre. Cada extends añade un nivel a la cadena de herencia:
# 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 tiene todo lo de Car y Vehicle. Cada super() sube un nivel, así que una llamada ejecuta las tres versiones de describe():
print(RaceCar.new(300).describe())Car with 4 wheels, top speed 300Cuando llamas a un método o lees una variable, Godot busca primero en la propia clase del objeto, después en su clase padre, luego en la clase padre de esta y usa la primera que encuentra. RaceCar.new(300).wheels se encuentra en Vehicle, dos niveles más arriba.
Cada clase tiene exactamente un padre. extends acepta una sola clase, y enumerar dos es un error de análisis:
class_name FlyingCar
extends Car, PlaneParse Error: Expected end of statement after superclass, found "," instead.GDScript no admite la herencia múltiple. Cuando una clase necesita las características de dos clases, colócalas en una misma cadena o dale un objeto de la otra clase con el que trabajar (en un capítulo posterior se aborda esto).
Desafío
Fácilcharacter.gd contiene la clase Character terminada: un nombre, hp, describe() que devuelve NAME (HP HP) y attack() que devuelve 1. Construye dos niveles más a partir de ella:
WarriorextiendeCharactery añadestrength. Su constructor pasa el nombre y los puntos de vida asuper().describe()añade, strength Sal texto de la clase padre, yattack()devuelve la fuerza.KnightextiendeWarriory añadearmor. Su constructor pasa el nombre, los puntos de vida y la fuerza asuper().describe()añade, armor Aal texto deWarrior, yattack()devuelve el ataque deWarriormás5.
El código proporcionado lee cuántos personajes vienen después y, a continuación, una línea por personaje: character NAME HP, warrior NAME HP STRENGTH o knight NAME HP STRENGTH ARMOR. Imprime describe() y el ataque. Para knight Arthur 120 15 8, imprime:
Arthur (120 HP), strength 15, armor 8
Attack: 20Tu código va en warrior.gd y knight.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: déjalo tal como está
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())
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online