Generic Sınıflar
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 65 / 110.
Dart'ın List<String> gibi yerleşik koleksiyonlarının tür parametrelerini nasıl kullandığını gördünüz. Şimdi, belirttiğiniz herhangi bir türle çalışan kendi generic sınıflarınızı oluşturma zamanı.
Genel (generic) bir sınıf, bir örnek oluşturulurken sağlanacak olan gerçek tür için bir yer tutucu olarak bir tür parametresi (genellikle T) kullanır:
class Box<T> {
T content;
Box(this.content);
T getContent() => content;
}
void main() {
var stringBox = Box<String>('Hello');
var intBox = Box<int>(42);
print(stringBox.getContent()); // Hello
print(intBox.getContent()); // 42
}T bir tip değişkeni olarak işlev görür - Box<String> oluşturduğunuzda, sınıftaki her T, String haline gelir. Bu, her tip için ayrı sınıflar yazmadan size tip güvenliği sağlar.
Sınıfınızın birden fazla tiple çalışması gerektiğinde birden çok tip parametresi kullanabilirsiniz:
class Pair<K, V> {
K first;
V second;
Pair(this.first, this.second);
}
void main() {
var pair = Pair<String, int>('age', 25);
print('${pair.first}: ${pair.second}'); // age: 25
}Generic sınıflar, yeniden kullanılabilir ve tür güvenli kodun temelidir. Farklı türler için mantığı yinelemek veya dynamic ile tür bilgisini kaybetmek yerine, generic'ler derleyicinin hala doğrulayabileceği esnek kodlar yazmanıza olanak tanır.
Görev
KolayFarklı türdeki öğeler için esnek kapsayıcılar oluşturmak amacıyla generic sınıfları kullanan bir hediye paketleme sistemi oluşturalım. Her türlü içeriği paketleyebilen generic bir Wrapper sınıfı ve bir hediyeyi bir kart mesajıyla eşleştirmek için iki tür parametresine sahip bir GiftBox sınıfı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
wrapper.dart: Generic sınıflarınızı burada tanımlayın:- Bir
T contentözelliğine ve bir yapıcıya (constructor) sahip generic birWrapper<T>sınıfı. İçeriği döndüren birunwrap()metodu veWrapped: [content]yazdıran birdescribe()metodu ekleyin. - İki özelliğe sahip generic bir
GiftBox<G, C>sınıfı:G giftveC card. Bir yapıcı ve bir satıraGift: [gift], sonraki satıraCard: [card]yazdıran biropen()metodu ekleyin.
- Bir
main.dart: Wrapper dosyanızı içe aktarın ve generic sınıfları farklı türlerle gösterin:'Chocolate'içeren birWrapper<String>oluşturun vedescribe()metodunu çağırın.42içeren birWrapper<int>oluşturun vedescribe()metodunu çağırın.3.14içeren birWrapper<double>oluşturun vedescribe()metodunu çağırın.- Boş bir satır yazdırın.
- Hediyesi
'Teddy Bear've kartı'Happy Birthday!'olan birGiftBox<String, String>oluşturun, ardındanopen()metodunu çağırın. - Boş bir satır yazdırın.
- Hediyesi
100(bir hediye kartı tutarını temsil eden) ve kartı'Congratulations!'olan birGiftBox<int, String>oluşturun, ardındanopen()metodunu çağırın.
Aynı Wrapper sınıfının dizeler (strings), tam sayılar (integers) ve ondalıklı sayılarla (doubles) nasıl sorunsuz çalıştığına dikkat edin. GiftBox sınıfı, farklı türleri bir araya getirmek için iki tür parametresinin kullanımını gösterir - kart mesajı bir dize olarak kalırken hediye herhangi bir türde olabilir.
Beklenen çıktı:
Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14
Gift: Teddy Bear
Card: Happy Birthday!
Gift: 100
Card: Congratulations!Kopya kağıdı
Genel sınıflar, örnekler oluşturulurken belirtilen gerçek türler için yer tutucu olarak tür parametrelerini (T gibi) kullanır:
class Box<T> {
T content;
Box(this.content);
T getContent() => content;
}
void main() {
var stringBox = Box<String>('Hello');
var intBox = Box<int>(42);
print(stringBox.getContent()); // Hello
print(intBox.getContent()); // 42
}Box<String> oluşturduğunuzda, sınıftaki her T, String haline gelir ve her tür için ayrı sınıflar gerekmeden tür güvenliği sağlar.
Birden fazla türle çalışırken birden fazla tür parametresi kullanın:
class Pair<K, V> {
K first;
V second;
Pair(this.first, this.second);
}
void main() {
var pair = Pair<String, int>('age', 25);
print('${pair.first}: ${pair.second}'); // age: 25
}Kendin dene
import 'wrapper.dart';
void main() {
// TODO: 'Chocolate' içeren bir Wrapper<String> oluşturun ve describe() metodunu çağırın
// TODO: 42 içeren bir Wrapper<int> oluşturun ve describe() metodunu çağırın
// TODO: 3.14 içeren bir Wrapper<double> oluşturun ve describe() metodunu çağırın
// TODO: Boş bir satır yazdırın
// TODO: Hediyesi 'Teddy Bear' ve kartı 'Happy Birthday!' olan
// bir GiftBox<String, String> oluşturun, ardından open() metodunu çağırın
// TODO: Boş bir satır yazdırın
// TODO: Hediyesi 100 ve kartı 'Congratulations!' olan
// bir GiftBox<int, String> oluşturun, ardından open() metodunu ç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ı