Menu
Coddy logo textTech

Generic Kısıtlamalar

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 67 / 110.

Bazen bir genel (generic) türün belirli yeteneklere sahip olmasına ihtiyaç duyarsınız. Örneğin, öğeleri karşılaştırmak veya belirli özelliklere erişmek istiyorsanız, kısıtlanmamış bir T bu özelliklerin var olduğunu garanti etmez. Genel kısıtlamalar (generic constraints), tür parametrelerini belirli türlerle veya onların alt sınıflarıyla sınırlandırmanıza olanak tanır.

Bir tip parametresini kısıtlamak için extends anahtar kelimesini kullanın:

class NumberBox<T extends num> {
  T value;
  
  NumberBox(this.value);
  
  T doubled() => (value * 2) as T;
}

void main() {
  var intBox = NumberBox<int>(5);
  var doubleBox = NumberBox<double>(3.5);
  
  print(intBox.doubled());    // 10
  print(doubleBox.doubled()); // 7.0
  
  // var stringBox = NumberBox<String>('hi');  // Hata!
}

T extends num olduğu için, derleyici value değişkeninin çarpma gibi sayısal işlemleri desteklediğini bilir. Bu kısıtlama olmadan, value * 2 çağrısı başarısız olurdu.

Kısıtlamalar kendi sınıf hiyerarşilerinizle de çalışır:

abstract class Animal {
  String get name;
}

class Dog extends Animal {
  String get name => 'Dog';
}

class Shelter<T extends Animal> {
  List<T> animals = [];
  
  void add(T animal) => animals.add(animal);
  
  void printNames() {
    for (var animal in animals) {
      print(animal.name);  // Güvenli: T, 'name'in varlığını garanti eder
    }
  }
}

Jenerik kısıtlamalar, jeneriklerin esnekliğini, türünüz üzerinde hangi işlemlerin mevcut olduğunu bilmenin güvenliğiyle birleştirir.

challenge icon

Görev

Kolay

Sadece sayısal türlerle çalışan bir istatistik hesaplayıcı oluşturalım! Sayılarla kullanılabileceğini garanti eden bir kısıtlamaya sahip genel (generic) bir sınıf oluşturacaksınız; bu, saklanan değerler üzerinde güvenli bir şekilde matematiksel işlemler yapmanıza olanak tanıyacak.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • stats.dart: Sayısal değerlerden oluşan bir listeyi yöneten genel bir Stats<T extends num> sınıfı oluşturun:
    • Sayıları saklamak için values adında bir List<T>
    • Listeyi sağlanan değerlerle başlatan bir yapıcı (constructor)
    • Tüm değerlerin toplamını bir num olarak döndüren bir sum() metodu
    • En küçük değeri T olarak döndüren bir min() metodu
    • En büyük değeri T olarak döndüren bir max() metodu
    • İstatistikleri biçimlendirilmiş bir şekilde görüntüleyen bir printStats() metodu
  • main.dart: İstatistik dosyanızı içe aktarın ve kısıtlanmış genel sınıfı farklı sayısal türlerle gösterin:
    • [10, 25, 5, 30, 15] değerlerine sahip bir Stats<int> oluşturun ve printStats() metodunu çağırın
    • Boş bir satır yazdırın
    • [3.5, 1.2, 4.8, 2.1] değerlerine sahip bir Stats<double> oluşturun ve printStats() metodunu çağırın

printStats() metodu toplam, minimum ve maksimum değerleri gösteren üç satır çıktı vermelidir. T extends num olduğu için, değerler üzerinde karşılaştırma operatörlerini ve aritmetik işlemleri güvenle kullanabilirsiniz - bu, kısıtlanmamış bir genel türle mümkün olmazdı.

Beklenen çıktı:

Sum: 85
Min: 5
Max: 30

Sum: 11.6
Min: 1.2
Max: 4.8

Kopya kağıdı

Genel kısıtlamalar, extends anahtar kelimesini kullanarak tür parametrelerini belirli türlerle veya bunların alt sınıflarıyla sınırlandırır:

class NumberBox<T extends num> {
  T value;
  
  NumberBox(this.value);
  
  T doubled() => (value * 2) as T;
}

T extends num ile derleyici, value değişkeninin çarpma gibi sayısal işlemleri desteklediğini bilir.

Kısıtlamalar ayrıca özel sınıf hiyerarşileriyle de çalışır:

abstract class Animal {
  String get name;
}

class Shelter<T extends Animal> {
  List<T> animals = [];
  
  void printNames() {
    for (var animal in animals) {
      print(animal.name);  // Güvenli: T, 'name' özelliğinin varlığını garanti eder
    }
  }
}

Genel kısıtlamalar, tür güvenliğini ve kullanılabilir işlemleri sağlarken esneklik sunar.

Kendin dene

import 'stats.dart';

void main() {
  // YAPILACAK: [10, 25, 5, 30, 15] değerlerine sahip bir Stats<int> oluşturun
  // ve printStats() fonksiyonunu çağırın
  
  // YAPILACAK: Boş bir satır yazdırın
  
  // YAPILACAK: [3.5, 1.2, 4.8, 2.1] değerlerine sahip bir Stats<double> oluşturun
  // ve printStats() 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