Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Uma garagem lida com cada veículo por meio de um único Array[Vehicle]. Em vehicle.gd, wheels() retorna 0 e sound() retorna ....

  • Escreva describe() em Vehicle. Ele retorna BRAND: N wheels, SOUND, chamando wheels() e sound().
  • Car sobrescreve wheels() com 4 e sound() com Vroom.
  • Motorcycle os sobrescreve com 2 e Brrm.
  • Truck já armazena o número de trailers. Ele sobrescreve wheels() com 6 mais 4 por reboque, e sound() com Honk.

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: 18

Seu 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)
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