Menu
Coddy logo textTech

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.0

area 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.78

Setter, 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.

challenge icon

Görev

Kolay

Oyuncu 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 bir Player sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Oyuncunun adı için bir String name alanı
    • 0 ile başlayan özel (private) bir int _score alanı
    • 3 ile başlayan özel (private) bir int _lives alanı
    • Oyuncunun adını alan bir yapıcı (constructor)
    • Mevcut puanı döndüren bir score getter'ı
    • Yalnızca 0 veya daha büyük değerleri kabul eden bir score setter'ı (negatif değerleri yoksayın)
    • Mevcut can sayısını döndüren bir lives getter'ı
    • Yalnızca 0 ile 5 (dahil) arasındaki değerleri kabul eden bir lives setter'ı (bu aralık dışındaki değerleri yoksayın)
    • Puan üzerinden oyuncunun seviyesini hesaplayan bir level getter'ı: puanın 100'e bölümü (tam sayı bölmesi), artı 1
    • Can sayısı 0'dan büyükse true döndüren bir isAlive getter'ı
    • Oyuncunun mevcut durumunu yazdıran bir displayStatus() metodu
  • 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ı 250 olarak ayarlayın ve displayStatus() metodunu çağırın
    • Puanı -50 olarak ayarlamayı deneyin (yoksayılmalıdır) ve displayStatus() metodunu çağırın
    • Can sayısını 1 olarak ayarlayın ve displayStatus() metodunu çağırın
    • Can sayısını 10 olarak ayarlamayı deneyin (yoksayılmalıdır) ve displayStatus() 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: true

Kopya 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.0

Setter - 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.78

Setter'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
}
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