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.
Görev
KolaySadece 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 birStats<T extends num>sınıfı oluşturun:- Sayıları saklamak için
valuesadında birList<T> - Listeyi sağlanan değerlerle başlatan bir yapıcı (constructor)
- Tüm değerlerin toplamını bir
numolarak döndüren birsum()metodu - En küçük değeri
Tolarak döndüren birmin()metodu - En büyük değeri
Tolarak döndüren birmax()metodu - İstatistikleri biçimlendirilmiş bir şekilde görüntüleyen bir
printStats()metodu
- Sayıları saklamak için
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 birStats<int>oluşturun veprintStats()metodunu çağırın- Boş bir satır yazdırın
[3.5, 1.2, 4.8, 2.1]değerlerine sahip birStats<double>oluşturun veprintStats()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.8Kopya 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
}
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ı