Menu
CoddyTech

Public ve Private Üyeler

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 26 / 65.

Kapsülleme, bir nesnenin verilerini bu verileri değiştiren yöntemlerle birlikte tutması ve diğer kodların üyelerinden hangilerini kullanabileceğine karar vermesi demektir. Diğer kodların kullanması için tasarlanan üyeler, nesnenin arayüzünü oluşturur.

GDScript'te public veya private anahtar sözcüğü yoktur: her üyeye dışarıdan erişilebilir. Godot stil kılavuzu, özel olanları başında alt çizgiyle işaretler:

# bank_account.gd
class_name BankAccount
extends RefCounted

var owner_name: String
var _balance: int = 0
var _history: Array[String] = []

func _init(holder: String) -> void:
	owner_name = holder

func deposit(amount: int) -> void:
	_balance += amount
	_record("deposit %d" % amount)

func get_balance() -> int:
	return _balance

func _record(entry: String) -> void:
	_history.append(entry)

owner_name, deposit() ve get_balance() herkese açıktır, bu nedenle main.gd bunları kullanır. _balance, _history ve _record() özeldir: bunları yalnızca bank_account.gd içindeki kod kullanır.

# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70

Alt çizgi bir kuraldır, bir kilit değil: account._balance = 1000000, main.gd içinde hiçbir hata vermeden çalışır. Yine de kurala uy. Yalnızca sınıf _balance değerini değiştirdiğinde, yanlış bakiye ancak bank_account.gd içindeki bir yöntemden kaynaklanabilir; bu nedenle kontrol etmen gereken tek dosya odur.

GDScript'te protected düzeyi de yoktur. Bir alt sınıf, özel üyeler de dahil olmak üzere tüm üyeleri devralır; bu nedenle BankAccount sınıfını extends ile genişleten bir SavingsAccount, kendi yöntemlerinde _balance kullanabilir.

Godot'un _init() ve _ready() gibi sanal metotları da alt çizgiyle başlar. Godot bunları senin için çağırır, bu yüzden özel metotlarından birine asla aynı adı verme.

challenge icon

Görev

Kolay

hero.gd dosyasındaki Hero sınıfını tamamla. Herkese açık üyeleri hero_name, gain_xp(), get_xp() ve get_level() şeklindedir. Diğerleri özeldir:

  • _xp (başlangıç değeri 0) ve _level (başlangıç değeri 1) özel değişkenlerini ekle.
  • _level değerini 1 + _xp / 100 olarak ayarlayan (tam sayı bölmesiyle) özel _update_level() metodunu ekle.
  • gain_xp(amount), amount değerini _xp değerine ekler, _update_level() metodunu çağırır ve seviye arttığında true, aksi takdirde false döndürür.
  • get_xp() ve get_level() özel değerleri döndürür.

Sağlanan kod, kahramanın adını, ardından kaç XP miktarının geleceğini, sonrasında da her satırda bir miktar okur. Her miktardan sonra, gain_xp() true döndürdüğünde bir Level up! satırı, ardından kahramanın durumunu yazdırır. Ada ve 40, 70 ve 250 miktarları için şu çıktıyı verir:

Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4

Kodunu hero.gd dosyasına yaz. main.gd, sağlanan 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 hero := Hero.new(OS.read_string_from_stdin())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var amount := int(OS.read_string_from_stdin())
		if hero.gain_xp(amount):
			print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
		print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
quiz iconKendini test et

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

Kendi başına pratik yap: Online GDScript derleyicisi