Sobrescrita de métodos
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 17 de 65.
Uma classe filha sobrescreve um método ao definir um método com o mesmo nome. Os objetos da classe filha executam então a versão da classe filha, e os métodos que ela não sobrescreve continuam sendo herdados sem alterações.
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
func make_sound() -> void:
print("Some generic animal sound")
func info() -> void:
print("I am ", animal_name)# dog.gd
class_name Dog
extends Animal
func make_sound() -> void:
print("Woof! Woof!")var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()Some generic animal sound
Woof! Woof!
I am BuddyA sobrescrita deve manter a assinatura do método da classe pai: os mesmos parâmetros e o mesmo tipo de retorno. Com uma assinatura diferente, o programa não inicia:
# animal.gd
func speak(times: int) -> String:
return "...".repeat(times)# dog.gd
func speak() -> String:
return "Woof"Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".A versão da classe filha é executada mesmo quando a chamada vem de um método da classe pai. Aqui, introduce() existe apenas em Animal, e chama sound(), que Cat sobrescreve:
# animal.gd
func sound() -> String:
return "..."
func introduce() -> String:
return animal_name + " says " + sound()# cat.gd
func sound() -> String:
return "Meow"print(Cat.new("Tom").introduce())Tom says MeowAs variáveis não podem ser sobrescritas: declarar var animal_name novamente em Dog é um erro de análise (The member "animal_name" already exists in parent class Animal). Para dar a uma classe filha um valor inicial diferente, atribua-o em _init() da classe filha.
Desafio
Fácilshape.gd contém a classe Shape concluída: uma color, area() retornando 0.0 e describe(). Circle e Square estendem essa classe e já têm seus construtores. Sobrescreva dois métodos em cada uma:
Circle:area()retornaPI * radius * radius, edescribe()retornaThis is a COLOR circle with radius R.Square:area()retornaside * side, edescribe()retornaThis is a COLOR square with side S.
Mantenha as assinaturas da classe pai: func area() -> float e func describe() -> String.
O código fornecido lê quantas formas vêm a seguir e, então, uma linha por forma: shape COLOR, circle COLOR RADIUS ou square COLOR SIDE. Ele imprime describe() e a área com duas casas decimais. Para circle red 5 e shape green, ele imprime:
This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00Seu código deve ficar em circle.gd e square.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 parts := OS.read_string_from_stdin().split(" ")
var shape: Shape
if parts[0] == "circle":
shape = Circle.new(parts[1], int(parts[2]))
elif parts[0] == "square":
shape = Square.new(parts[1], int(parts[2]))
else:
shape = Shape.new(parts[1])
print(shape.describe())
print("Area: %.2f" % shape.area())
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