Mixin'lere Giriş
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 50 / 110.
Dart'ın yalnızca bir sınıfı genişletmeye izin verdiğini ve birden çok arayüzü uygulayabilseniz de tüm kodu kendiniz yazmanız gerektiğini öğrendiniz. Peki, gerçek uygulama kodunu birbiriyle ilişkili olmayan birden çok sınıf arasında paylaşmak isterseniz ne olacak? İşte mixin'ler burada devreye girer.
Mixin, kodu birden fazla sınıf hiyerarşisinde yeniden kullanmanın bir yoludur. Bunu, herhangi bir sınıfa "karıştırabileceğiniz" ve kalıtım kullanmadan sınıfa yeni yetenekler kazandıran bir yöntem ve özellik paketi olarak düşünebilirsiniz.
mixin Swimming {
void swim() {
print('Swimming through the water');
}
}
class Duck with Swimming {
void quack() {
print('Quack!');
}
}
class Fish with Swimming {
void blowBubbles() {
print('Blub blub');
}
}
void main() {
var duck = Duck();
duck.quack();
duck.swim(); // Mixin'den
var fish = Fish();
fish.swim(); // Aynı uygulama, farklı sınıf
}with anahtar sözcüğüne dikkat edin - bir mixin'i sınıfa bu şekilde uygularsınız. implements'ten farklı olarak yöntemi kendiniz yazmanız gerekmez. Mixin gerçek kodu sağlar ve sınıfınız bu işlevselliği otomatik olarak kazanır.
Mixin'ler gerçek bir sorunu çözer: Duck ve Fish kalıtım yoluyla ilişkili değildir, ancak her ikisinin de yüzme davranışına ihtiyacı vardır. Mixin'lerle kodu bir kez yazar ve gerektiği her yerde paylaşırsın.
Görev
Kolayİlişkisiz sınıflar arasında davranışı paylaşmak için mixin'lerin nasıl kullanılabileceğini gösteren bir müzik aleti sistemi oluşturalım. Akort işlevselliği sağlayan bir mixin oluşturacak, ardından bunu kalıtım yoluyla ilişkili olmayan farklı müzik aletlerine uygulayacaksın.
Kodunu iki dosyaya ayıracaksın:
instruments.dart: Mixin'ini ve müzik aleti sınıflarını burada tanımla:Tunablemixin'i;tune()yazdıranTuning the instrument...metoduna vecheckTuning()yazdıranTuning is perfect!metoduna sahip olmalı.Guitarmixin'ini kullanan birTunablesınıfı. Yapıcıya sahip birString brandözelliği ekle.strum()yazdıran bir[brand] guitar strumming chordsmetodu ekle.- Aynı zamanda
Pianomixin'ini kullanan birTunablesınıfı. Yapıcıya sahip birint keysözelliği ekle.play()yazdıran birPlaying [keys]-key pianometodu ekle.
main.dart: Müzik aletleri dosyanı içe aktar ve birbiriyle ilişkili olmayan iki müzik aletinin aynı mixin'den akort yeteneklerini nasıl kazandığını göster:Guitarmarkasına sahip bir'Fender'oluştur.Pianotuşlu bir88oluştur.- Gitar için: önce
tune(), ardındanstrum(), sonra dacheckTuning()çağır. - Boş bir satır yazdır.
- Piyano için: önce
tune(), ardındanplay(), sonra dacheckTuning()çağır.
Guitar ve Piano'nun kalıtım ilişkisi olmayan, tamamen farklı müzik aletleri olduğuna; buna rağmen ikisinin de Tunable mixin'inden tamamen aynı akort metotlarını kazandığına dikkat et. Akort kodunu bir kez yazarsın ve her iki sınıf da bunu with anahtar sözcüğüyle kullanabilir.
Beklenen çıktı:
Tuning the instrument...
Fender guitar strumming chords
Tuning is perfect!
Tuning the instrument...
Playing 88-key piano
Tuning is perfect!Kendin dene
import 'instruments.dart';
void main() {
// TODO: 'Fender' markalı bir Guitar oluştur
// TODO: 88 tuşlu bir Piano oluştur
// TODO: Gitar için: tune(), ardından strum() ve sonra checkTuning() fonksiyonlarını çağır
// TODO: Boş bir satır yazdır
// TODO: Piyano için: tune(), ardından play() ve sonra checkTuning() fonksiyonlarını çağır
}
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