Revisitando a Sobrescrita de Métodos
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 21 de 65.
Polimorfismo significa "muitas formas": uma chamada de método faz coisas diferentes dependendo da classe do objeto que a recebe. A sobrescrita é o que torna isso possível.
# animal.gd
class_name Animal
extends RefCounted
func speak() -> String:
return "..."# dog.gd
class_name Dog
extends Animal
func speak() -> String:
return "Woof!"# cat.gd
class_name Cat
extends Animal
func speak() -> String:
return "Meow!"Um Array[Animal] pode conter todos eles. O loop chama speak() sem saber de qual classe é cada elemento, e cada objeto responde com sua própria versão:
var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
print(animal.speak())Woof!
Meow!
...Uma função com um parâmetro Animal funciona da mesma maneira. Ela aceita todas as classes derivadas, incluindo as que você adicionar depois, sem nenhuma alteração:
func make_it_speak(animal: Animal) -> void:
print("It says ", animal.speak())make_it_speak(Cat.new())It says Meow!Compare isso com verificar as classes uma a uma. Uma cadeia de ramificações if animal is Dog: precisa crescer a cada nova classe. Com a sobrescrita, cada classe carrega seu próprio comportamento, e o código que a chama permanece igual.
Desafio
FácilUma garagem lida com cada veículo por meio de um único Array[Vehicle]. Em vehicle.gd, wheels() retorna 0 e sound() retorna ....
- Escreva
describe()emVehicle. Ele retornaBRAND: N wheels, SOUND, chamandowheels()esound(). Carsobrescrevewheels()com4esound()comVroom.Motorcycleos sobrescreve com2eBrrm.Truckjá armazena o número detrailers. Ele sobrescrevewheels()com6mais4por reboque, esound()comHonk.
As classes filhas não sobrescrevem describe(). O código fornecido lê quantos veículos vêm em seguida e, então, uma linha por veículo: car BRAND, motorcycle BRAND, truck BRAND TRAILERS ou vehicle BRAND. Ele imprime cada describe() e o total de wheels(). Para car Toyota e truck Volvo 2, ele imprime:
Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18Seu código deve ficar em vehicle.gd, car.gd, motorcycle.gd e truck.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())
var vehicles: Array[Vehicle] = []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "car":
vehicles.append(Car.new(p[1]))
elif p[0] == "motorcycle":
vehicles.append(Motorcycle.new(p[1]))
elif p[0] == "truck":
vehicles.append(Truck.new(p[1], int(p[2])))
else:
vehicles.append(Vehicle.new(p[1]))
var total := 0
for v in vehicles:
print(v.describe())
total += v.wheels()
print("Total wheels: %d" % total)
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