İç Sınıflar
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 65.
Bir sınıf, class anahtar sözcüğünü, bir adı ve girintili bir gövdeyi kullanarak kendi içinde başka bir sınıf bildirebilir. Bu iç sınıf, dış sınıfa ait bir yardımcı türdür:
# inventory.gd
class_name Inventory
extends RefCounted
const MAX_STACK := 5
class Slot:
var item_name: String
var count: int
func _init(new_name: String, new_count: int) -> void:
item_name = new_name
count = mini(new_count, MAX_STACK)
func _to_string() -> String:
return "%s x%d" % [item_name, count]
var slots: Array[Slot] = []
func add(item_name: String, count: int) -> Slot:
var slot := Slot.new(item_name, count)
slots.append(slot)
return slotinventory.gd içinde iç sınıf Slot'tur. Diğer tüm dosyalar bu sınıfa dış sınıf üzerinden erişir: Inventory.Slot.
# main.gd
var bag := Inventory.new()
bag.add("Potion", 9)
var arrows: Inventory.Slot = bag.add("Arrow", 3)
print(bag.slots) # [Potion x5, Arrow x3]
var gem := Inventory.Slot.new("Gem", 1)extends kullanmayan bir iç sınıf, RefCounted sınıfını genişletir ve her sınıf gibi değişkenlere, bir kurucuya ve yöntemlere sahip olabilir. Dış sınıfın sabitlerini ve enum'larını (MAX_STACK yukarıda) kullanabilir, ancak üye değişkenlerini kullanamaz: Slot, slots değişkenine erişemez çünkü bir yuva ayrı bir nesnedir. İhtiyaç duyduğu değerleri kurucusuna aktar.
Yalnızca dış sınıfıyla birlikte anlamlı olan küçük bir tür için iç sınıf kullan; örneğin bir envanter yuvası veya puan tablosu girdisi. Oyunun diğer bölümlerinin tek başına kullandığı bir tür, kendi dosyasını ve class_name adını hak eder.
Görev
KolayGirdileri iç sınıf olan bir Leaderboard oluştur.
LeaderboardiçindeEntryiç sınıfını tanımla;player_namevescorekurucusu tarafından ayarlansın ve_to_string()Ada: 120döndürsün.entries, oyuncuların ilk göründükleri sıraya göre sıralanan,Entrytüründe bir dizidir.submit(player, score), yeni bir oyuncu için yeni bir girdi ekler. Zaten girdisi olan bir oyuncu için iki skordan yüksek olanı tutar.best(), en yüksek skora sahip girdiyi döndürür. Eşitlik durumunda ilk sırada görünen girdi kazanır.
Verilen kod, ardından kaç skor geleceğini okur (Ada 120), bunları gönderir, sonra her girdiyi ve en iyi olanı yazdırır (her zaman en az bir skor verilir). Ada 120, Bo 90, Ada 80, Bo 150, Cy 150 için şunu yazdırır:
Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150Kodunu leaderboard.gd dosyasına yaz. main.gd, verilen girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
var board := Leaderboard.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
board.submit(parts[0], int(parts[1]))
for entry in board.entries:
print(entry)
print("Best: ", board.best())
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt Sistemi8İleri OOP Kavramları
Composition ve Inheritance Karşılaştırmasıİç SınıflarBileşen Olarak DüğümlerRefCounted ve Node KarşılaştırmasıSınıflarda Enum’larKendi başına pratik yap: Online GDScript derleyicisi