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 türün belirli yeteneklere sahip olması gerekir. Örneğin, öğeleri karşılaştırmak veya belirli özelliklere erişmek istiyorsanız, kısıtlanmamış bir T bu özelliklerin mevcut olduğunu garanti etmez. Genel tür kısıtlamaları, tür parametrelerini belirli türlerle veya bunların alt sınıflarıyla sınırlandırmanızı sağlar.

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

Yalnızca sayısal türlerle çalışan bir istatistik hesaplayıcısı oluşturalım! Yalnızca sayılarla kullanılabilmesini sağlayan bir kısıtlamaya sahip genel bir sınıf oluşturacak ve böylece depolanan değerler üzerinde matematiksel işlemleri güvenle gerçekleştirebileceksin.

Kodunu iki dosyaya ayıracaksın:

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

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

Beklenen çıktı:

Sum: 85
Min: 5
Max: 30

Sum: 11.6
Min: 1.2
Max: 4.8

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

Kendi başına pratik yap: Online Dart derleyicisi