Getters ve Setters
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 21 / 110.
Getter ve setter'lar, sınıf alanlarına normal özellikler gibi görünen özel yöntemler aracılığıyla erişmek ve bunları değiştirmek için bir yol sağlar. Alanları doğrudan açığa çıkarmak yerine, değerlerin nasıl okunduğunu ve yazıldığını kontrol edebilirsiniz.
Bir getter, get anahtar kelimesi kullanılarak tanımlanır ve hesaplanmış veya saklanmış bir değer döndürür:
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
double get area => width * height;
double get perimeter => 2 * (width + height);
}
Rectangle rect = Rectangle(5, 3);
print(rect.area); // 15.0
print(rect.perimeter); // 16.0area ve perimeter özelliklerine alanlar gibi erişildiğine, ancak her seferinde hesaplandıklarına dikkat edin. Parantez gerekmez.
Bir setter, set anahtar kelimesini kullanır ve bir değerin nasıl atandığını kontrol etmenize olanak tanır:
class Temperature {
double _celsius;
Temperature(this._celsius);
double get celsius => _celsius;
set celsius(double value) {
if (value >= -273.15) {
_celsius = value;
}
}
double get fahrenheit => _celsius * 9 / 5 + 32;
set fahrenheit(double value) {
celsius = (value - 32) * 5 / 9;
}
}
Temperature temp = Temperature(25);
print(temp.fahrenheit); // 77.0
temp.fahrenheit = 100;
print(temp.celsius); // 37.78Setter, girdiyi depolamadan önce doğrular ve hatta birimler arasında dönüşüm yapabilir. Bu, sınıfınızın kullanıcıları için temiz, özellik benzeri bir sözdizimi korurken verileriniz üzerinde kontrol sahibi olmanızı sağlar.
Görev
KolayOyuncu istatistiklerini doğrulama ve hesaplanmış değerlerle yönetmek için getter ve setter'ları kullanan bir oyun puan takipçisi oluşturalım.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
player.dart: Bir oyuncunun oyun performansını takip eden birPlayersınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:- Oyuncunun adı için bir
String namealanı 0ile başlayan özel (private) birint _scorealanı3ile başlayan özel (private) birint _livesalanı- Oyuncunun adını alan bir yapıcı (constructor)
- Mevcut puanı döndüren bir
scoregetter'ı - Yalnızca
0veya daha büyük değerleri kabul eden birscoresetter'ı (negatif değerleri yoksayın) - Mevcut can sayısını döndüren bir
livesgetter'ı - Yalnızca
0ile5(dahil) arasındaki değerleri kabul eden birlivessetter'ı (bu aralık dışındaki değerleri yoksayın) - Puan üzerinden oyuncunun seviyesini hesaplayan bir
levelgetter'ı: puanın100'e bölümü (tam sayı bölmesi), artı1 - Can sayısı
0'dan büyüksetruedöndüren birisAlivegetter'ı - Oyuncunun mevcut durumunu yazdıran bir
displayStatus()metodu
- Oyuncunun adı için bir
main.dart: Oyuncu sınıfınızı içe aktarın ve getter ile setter'ları gösterin:'Alex'adında bir oyuncu oluşturun- Puanı
250olarak ayarlayın vedisplayStatus()metodunu çağırın - Puanı
-50olarak ayarlamayı deneyin (yoksayılmalıdır) vedisplayStatus()metodunu çağırın - Can sayısını
1olarak ayarlayın vedisplayStatus()metodunu çağırın - Can sayısını
10olarak ayarlamayı deneyin (yoksayılmalıdır) vedisplayStatus()metodunu çağırın
displayStatus() metodu tam olarak şu formatta yazdırmalıdır:
[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]Beklenen çıktı:
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: trueKopya kağıdı
Getter ve setter'lar, normal özellikler gibi görünen özel metotlar aracılığıyla sınıf alanlarına kontrollü erişim sağlar.
Getter - get anahtar kelimesi kullanılarak tanımlanır, hesaplanmış veya saklanmış bir değer döndürür:
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
double get area => width * height;
double get perimeter => 2 * (width + height);
}
Rectangle rect = Rectangle(5, 3);
print(rect.area); // 15.0 - bir alan gibi erişilir, parantez yok
print(rect.perimeter); // 16.0Setter - set anahtar kelimesini kullanır, değerlerin nasıl atandığını kontrol eder:
class Temperature {
double _celsius;
Temperature(this._celsius);
double get celsius => _celsius;
set celsius(double value) {
if (value >= -273.15) {
_celsius = value;
}
}
double get fahrenheit => _celsius * 9 / 5 + 32;
set fahrenheit(double value) {
celsius = (value - 32) * 5 / 9;
}
}
Temperature temp = Temperature(25);
print(temp.fahrenheit); // 77.0
temp.fahrenheit = 100;
print(temp.celsius); // 37.78Setter'lar, temiz ve özellik benzeri bir sözdizimini korurken girdiyi doğrulayabilir ve birimler arasında dönüşüm yapabilir.
Kendin dene
import 'player.dart';
void main() {
// TODO: 'Alex' adında bir oyuncu oluşturun
// TODO: Skoru 250 olarak ayarlayın ve displayStatus() fonksiyonunu çağırın
// TODO: Skoru -50 yapmayı deneyin (göz ardı edilmeli) ve displayStatus() fonksiyonunu çağırın
// TODO: Can sayısını 1 olarak ayarlayın ve displayStatus() fonksiyonunu çağırın
// TODO: Can sayısını 10 yapmayı deneyin (göz ardı edilmeli) ve displayStatus() fonksiyonunu çağırın
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı