Generic Sınıflar
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 65 / 110.
List<String> gibi Dart'ın yerleşik koleksiyonlarının tür parametrelerini nasıl kullandığını gördün. Şimdi, belirttiğin herhangi bir türle çalışan kendi genel sınıflarını oluşturma zamanı.
Genel bir sınıf, bir örnek oluşturulurken sağlanacak gerçek tür için 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 tür değişkeni görevi görür - Box<String> oluşturduğunuzda, sınıftaki her T String olur. Bu, her tür için ayrı sınıflar yazmadan tür güvenliği sağlar.
Birden fazla türle çalışması gerektiğinde sınıfınızda birden çok tür 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
}Jenerik 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 bilgilerini kaybetmek yerine, jenerikler derleyicinin yine de doğrulayabileceği esnek kod yazmanıza olanak tanır.
Görev
KolayFarklı öğe türleri için esnek kapsayıcılar oluşturmak üzere jenerik sınıfları kullanan bir hediye paketleme sistemi oluşturalım. Her tür içeriği paketleyebilen jenerik bir Wrapper sınıfı ve bir hediyeyi kart mesajıyla eşleştirmek için iki tür parametresine sahip bir GiftBox sınıfı oluşturacaksınız.
Kodunuzu iki dosyada düzenleyeceksiniz:
wrapper.dart: Jenerik sınıflarınızı burada tanımlayın:Wrapper<T>özelliğine ve bir kurucuya sahip jenerik birT contentsınıfı. İçeriği döndürenunwrap()yöntemini vedescribe()yazdıranWrapped: [content]yöntemini ekleyin- İki özelliğe sahip jenerik bir
GiftBox<G, C>sınıfı:G giftveC card. Bir kurucu ve bir satırdaopen(), sonraki satırdaGift: [gift]yazdıranCard: [card]yöntemini ekleyin
main.dart: Wrapper dosyanızı içe aktarın ve jenerik sınıfları farklı türlerle gösterin:Wrapper<String>içeren bir'Chocolate'oluşturun vedescribe()yöntemini çağırınWrapper<int>içeren bir42oluşturun vedescribe()yöntemini çağırınWrapper<double>içeren bir3.14oluşturun vedescribe()yöntemini çağırın- Boş bir satır yazdırın
GiftBox<String, String>hediyesi ve'Teddy Bear'kartıyla bir'Happy Birthday!'oluşturun, ardındanopen()yöntemini çağırın- Boş bir satır yazdırın
- Hediyesi
GiftBox<int, String>(hediye kartı tutarını temsil eder) ve kartı100olan bir'Congratulations!'oluşturun, ardındanopen()yöntemini çağırın
Aynı Wrapper sınıfının dizeler, tam sayılar ve double değerleriyle nasıl sorunsuz çalıştığına dikkat edin. GiftBox sınıfı, farklı türleri eşleştirmek için iki tür parametresinin kullanımını gösterir; hediye herhangi bir türde olabilirken kart mesajı bir dize olarak kalır.
Beklenen çıktı:
Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14
Gift: Teddy Bear
Card: Happy Birthday!
Gift: 100
Card: Congratulations!Kendin dene
import 'wrapper.dart';
void main() {
// TODO: 'Chocolate' içeren bir Wrapper<String> oluştur ve describe() çağır
// TODO: 42 içeren bir Wrapper<int> oluştur ve describe() çağır
// TODO: 3.14 içeren bir Wrapper<double> oluştur ve describe() çağır
// TODO: Boş bir satır yazdır
// TODO: Create a GiftBox<String, String> with gift 'Teddy Bear'
// and card 'Happy Birthday!', then call open()
// TODO: Boş bir satır yazdır
// TODO: hediye 100 ile bir GiftBox<int, String> oluştur
// and card 'Congratulations!', then call open()
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi