Menu
CoddyTech

Projektowanie interfejsów

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 24 z 65.

Interfejs to lista metod, które klasa zobowiązuje się mieć, ale bez ich kodu. Java i C# mają słowo kluczowe interface; GDScript go nie ma. Tworzysz to samo za pomocą klasy abstrakcyjnej, której metody są wszystkie abstrakcyjne:

# drawable.gd
@abstract
class_name Drawable
extends RefCounted

@abstract func draw() -> String
@abstract func resize(factor: int) -> void

Nie ma zmiennych ani treści metod. Opisuje, co może robić element, który da się narysować, a każda klasa sama o tym decyduje:

# banner.gd
class_name Banner
extends Drawable

var text: String
var size := 1

func _init(t: String) -> void:
	text = t

func draw() -> String:
	return "Banner '%s' at size %d" % [text, size]

func resize(factor: int) -> void:
	size *= factor

Circle również może rozszerzać Drawable, mając radius oraz własne metody draw() i resize(). Kod korzystający z interfejsu zależy tylko od niego, więc działa z każdą klasą rozszerzającą Drawable, także z tymi napisanymi później:

func render_all(items: Array[Drawable]) -> void:
	for item in items:
		item.resize(2)
		print(item.draw())
var items: Array[Drawable] = [Banner.new("Sale"), Circle.new(3)]
render_all(items)
Banner 'Sale' at size 2
Circle with radius 6

Klasa ma jednego rodzica, więc może rozszerzać tylko jeden interfejs. Gdy klasa pełni drugą rolę, na przykład jest zapisywana do pliku, rozszerz główny interfejs i sprawdź drugą rolę za pomocą has_method():

if item.has_method("save"):
	item.save()

Niech każdy interfejs będzie mały: kilka metod należących do jednej roli. Klasa, która go rozszerza, zapisuje wtedy tylko te metody, których potrzebuje.

challenge icon

Wyzwanie

Łatwy

Zbuduj odtwarzacz multimediów oparty na interfejsie.

  • W pliku playable.gd utwórz interfejs Playable: klasę abstrakcyjną z abstrakcyjnymi metodami play() -> String i duration() -> int (w sekundach).
  • Song dziedziczy po Playable. play() zwraca Playing song: TITLE by ARTIST, a duration() zwraca liczbę sekund utworu.
  • Video dziedziczy po Playable. play() zwraca Playing video: TITLE in RESOLUTIONp (na przykład in 1080p), a duration() zwraca liczbę sekund filmu.
  • Playlist zna tylko Playable. play_all() wypisuje wynik play() dla każdego elementu, a total_time() zwraca łączny czas trwania w formacie M:SS (sekundy zapisane za pomocą dwóch cyfr, na przykład 4:05).

Konstruktory Song i Video są już napisane. Dostarczony kod odczytuje liczbę kolejnych elementów, a następnie po jednym wierszu na element: song TITLE ARTIST SECONDS lub video TITLE RESOLUTION SECONDS. Wywołuje play_all() i wypisuje łączny czas. Dla song Imagine Lennon 183 i video Trailer 1080 95 wypisuje:

Playing song: Imagine by Lennon
Playing video: Trailer in 1080p
Total time: 4:38

Twój kod umieść w plikach playable.gd, song.gd, video.gd i playlist.gd. main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	var count := int(OS.read_string_from_stdin())
	var playlist := Playlist.new()
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "song":
			playlist.add(Song.new(p[1], p[2], int(p[3])))
		else:
			playlist.add(Video.new(p[1], int(p[2]), int(p[3])))
	playlist.play_all()
	print("Total time: " + playlist.total_time())
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online