Menu
CoddyTech

Cadeias de herança

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 18 de 65.

Uma classe filha pode ser, por sua vez, uma classe pai. Cada extends adiciona um nível à cadeia de herança:

# vehicle.gd
class_name Vehicle
extends RefCounted

var wheels: int

func _init(w: int) -> void:
	wheels = w

func describe() -> String:
	return "%d wheels" % wheels
# car.gd
class_name Car
extends Vehicle

func _init() -> void:
	super(4)

func describe() -> String:
	return "Car with " + super()
# race_car.gd
class_name RaceCar
extends Car

var top_speed: int

func _init(speed: int) -> void:
	super()
	top_speed = speed

func describe() -> String:
	return super() + ", top speed %d" % top_speed

RaceCar tem tudo de Car e de Vehicle. Cada super() sobe um nível, então uma chamada executa as três versões de describe():

print(RaceCar.new(300).describe())
Car with 4 wheels, top speed 300

Quando você chama um método ou lê uma variável, Godot procura primeiro na própria classe do objeto, depois na classe pai, depois na classe avó, e usa o primeiro que encontrar. RaceCar.new(300).wheels é encontrado em Vehicle, dois níveis acima.

Toda classe tem exatamente uma classe-pai. extends recebe uma única classe, e listar duas causa um erro de análise:

class_name FlyingCar
extends Car, Plane
Parse Error: Expected end of statement after superclass, found "," instead.

GDScript não oferece suporte a herança múltipla. Quando uma classe precisa dos recursos de duas classes, coloque-as em uma única cadeia ou dê a ela um objeto da outra classe para trabalhar (um capítulo posterior aborda isso).

challenge icon

Desafio

Fácil

character.gd contém a classe Character concluída: um nome, hp, describe() retornando NAME (HP HP) e attack() retornando 1. Crie mais dois níveis a partir dela:

  • Warrior estende Character e adiciona strength. Seu construtor passa o nome e hp para super(). describe() adiciona , strength S ao texto da classe pai, e attack() retorna a força.
  • Knight estende Warrior e adiciona armor. Seu construtor passa o nome, hp e strength para super(). describe() adiciona , armor A ao texto de Warrior, e attack() retorna o ataque de Warrior mais 5.

O código fornecido lê quantos personagens vêm a seguir e, então, uma linha por personagem: character NAME HP, warrior NAME HP STRENGTH ou knight NAME HP STRENGTH ARMOR. Ele exibe describe() e o ataque. Para knight Arthur 120 15 8, ele exibe:

Arthur (120 HP), strength 15, armor 8
Attack: 20

Seu código deve ficar em warrior.gd e knight.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 p := OS.read_string_from_stdin().split(" ")
		var c: Character
		if p[0] == "knight":
			c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
		elif p[0] == "warrior":
			c = Warrior.new(p[1], int(p[2]), int(p[3]))
		else:
			c = Character.new(p[1], int(p[2]))
		print(c.describe())
		print("Attack: %d" % c.attack())
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