A palavra-chave super
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 16 de 65.
Quando um filho precisa de dados extras, ele escreve seu próprio _init(). O construtor do pai então não é mais executado por conta própria. Chame-o com super(), passando os argumentos que o pai espera:
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
print("Animal created: ", n)# dog.gd
class_name Dog
extends Animal
var breed: String
func _init(n: String, b: String) -> void:
super(n)
breed = b
print("Dog breed set: ", b)var buddy := Dog.new("Buddy", "Beagle")
print(buddy.animal_name, " the ", buddy.breed)Animal created: Buddy
Dog breed set: Beagle
Buddy the BeagleSem a linha super(n), o programa ainda é executado, mas o construtor de Animal é ignorado: nada define animal_name, então ele continua sendo uma String vazia. Coloque super() primeiro, para que as variáveis da classe pai estejam prontas antes de a classe filha usá-las.
Em qualquer outro método, super() executa a versão do método da classe pai em que você está. A classe filha mantém o resultado da classe pai e o complementa:
# animal.gd
func describe() -> String:
return "I am " + animal_name# dog.gd
func describe() -> String:
return super() + ", a " + breedvar rex := Dog.new("Rex", "Husky")
print(rex.describe())Animal created: Rex
Dog breed set: Husky
I am Rex, a HuskyPara chamar um método diferente da classe pai, escreva seu nome depois de um ponto: super.describe() funciona em qualquer método de Dog.
Desafio
FácilEscreva uma classe Person e uma classe Employee que a estende.
Personarmazenaperson_nameeageem seu construtor.introduce()retornaHi, I'm NAME and I'm AGE years old.Employeeadicionajob. Seu construtor passa o nome e a idade parasuper()e armazena o cargo. Seuintroduce()retorna o resultado deintroduce()da classe pai, seguido de. I work as a JOB.
O código fornecido lê quantas pessoas vêm em seguida e, depois, uma linha por pessoa: person NAME AGE ou employee NAME AGE JOB. Ele imprime introduce() para cada uma. Para person Alice 30 e employee Bob 35 Developer, ele imprime:
Hi, I'm Alice and I'm 30 years old
Hi, I'm Bob and I'm 35 years old. I work as a DeveloperSeu código deve ficar em person.gd e employee.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(" ")
if parts[0] == "employee":
var employee := Employee.new(parts[1], int(parts[2]), parts[3])
print(employee.introduce())
else:
var person := Person.new(parts[1], int(parts[2]))
print(person.introduce())
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