Cadeias de herança
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 18 de 65.
Uma classe filha pode ser, por sua vez, uma classe pai. Cada extends adiciona um nível à cadeia de herança:
# 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 tem tudo de Car e de Vehicle. Cada super() sobe um nível, então uma chamada executa as três versões de describe():
print(RaceCar.new(300).describe())Car with 4 wheels, top speed 300Quando você chama um método ou lê uma variável, Godot procura primeiro na própria classe do objeto, depois na classe pai, depois na classe avó, e usa o primeiro que encontrar. RaceCar.new(300).wheels é encontrado em Vehicle, dois níveis acima.
Toda classe tem exatamente uma classe-pai. extends recebe uma única classe, e listar duas causa um erro de análise:
class_name FlyingCar
extends Car, PlaneParse Error: Expected end of statement after superclass, found "," instead.GDScript não oferece suporte a herança múltipla. Quando uma classe precisa dos recursos de duas classes, coloque-as em uma única cadeia ou dê a ela um objeto da outra classe para trabalhar (um capítulo posterior aborda isso).
Desafio
Fácilcharacter.gd contém a classe Character concluída: um nome, hp, describe() retornando NAME (HP HP) e attack() retornando 1. Crie mais dois níveis a partir dela:
WarriorestendeCharactere adicionastrength. Seu construtor passa o nome e hp parasuper().describe()adiciona, strength Sao texto da classe pai, eattack()retorna a força.KnightestendeWarriore adicionaarmor. Seu construtor passa o nome, hp e strength parasuper().describe()adiciona, armor Aao texto deWarrior, eattack()retorna o ataque deWarriormais5.
O código fornecido lê quantos personagens vêm a seguir e, então, uma linha por personagem: character NAME HP, warrior NAME HP STRENGTH ou knight NAME HP STRENGTH ARMOR. Ele exibe describe() e o ataque. Para knight Arthur 120 15 8, ele exibe:
Arthur (120 HP), strength 15, armor 8
Attack: 20Seu código deve ficar em warrior.gd e knight.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online