Menu
CoddyTech

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 Beagle

Sem 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 " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

Para chamar um método diferente da classe pai, escreva seu nome depois de um ponto: super.describe() funciona em qualquer método de Dog.

challenge icon

Desafio

Fácil

Escreva uma classe Person e uma classe Employee que a estende.

  • Person armazena person_name e age em seu construtor. introduce() retorna Hi, I'm NAME and I'm AGE years old.
  • Employee adiciona job. Seu construtor passa o nome e a idade para super() e armazena o cargo. Seu introduce() retorna o resultado de introduce() 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 Developer

Seu 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())
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de GDScript online