Mixin Oluşturma
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 51 / 110.
Artık mixin'lerin ne olduğunu anladığınıza göre, onları nasıl doğru şekilde oluşturacağınıza bakalım. Bir mixin, class yerine mixin anahtar sözcüğü kullanılarak bildirilir.
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}Mixin’ler, sınıflar gibi metotlar, özellikler ve hatta getter ile setter’lar içerebilir. Ancak önemli bir kural vardır: mixin’lerin kurucuları olamaz. Mixin’lerin doğrudan örneklenmek yerine “karıştırılması” amaçlandığından, başlatma mantığına ihtiyaç duymazlar.
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // Mixin'in metodunu kullanır
print(doc.createdAt); // Mixin'in özelliğini kullanır
}with ile bir mixin uyguladığınızda, tüm üyeleri sınıfınızın bir parçası olur. Sınıf bunları doğrudan kullanabilir; ayrıca bu sınıfın bir örneğine sahip olan herhangi bir kod da kullanabilir. Bu, mixin'leri kalıtım hiyerarşilerinin karmaşıklığı olmadan yeniden kullanılabilir işlevsellik eklemenin temiz bir yolu hâline getirir.
Görev
KolayYöntemler, özellikler ve getter'lar içeren mixin'ler oluşturmayı gösteren bir mesajlaşma sistemi oluşturalım. Farklı mesaj türlerine biçimlendirme özellikleri ekleyen bir mixin tasarlayacaksın.
Kodunu iki dosyaya ayıracaksın:
messaging.dart: Mixin'ini ve mesaj sınıflarını burada tanımla:- Aşağıdakileri içeren bir
Formattablemixin'i:String prefixolarak başlatılan bir'>>>'özelliğiseparatordöndüren bir' | 'getter'ıformat(String text)dizesini döndüren bir[prefix][separator][text]yöntemiformatBold(String text)döndüren bir**[text]**yöntemi
TextMessagemixin'ini kullanan birFormattablesınıfı. Bir kurucuyla birlikteString senderözelliği ekle.send(String content)ileformat()çağrısının sonucunu yazdıran bir[sender]: [content]yöntemi ekle.AlertMessagemixin'ini kullanan birFormattablesınıfı. Bir kurucuyla birlikteString levelözelliği ekle.alert(String content)ileformat()çağrısının sonucunu yazdıran bir[[level]] [formatBold(content)]yöntemi ekle.
- Aşağıdakileri içeren bir
main.dart: Mesajlaşma dosyanı içe aktar ve her iki mesaj türünün mixin'den biçimlendirme özelliklerini nasıl kazandığını göster:TextMessagegönderenine sahip bir'Alice'oluşturAlertMessageseviyesine sahip bir'WARNING'oluştur- Metin mesajı üzerinde
send('Hello there!')çağrısı yap - Uyarı mesajı üzerinde
alert('System overload')çağrısı yap
Mixin'in; varsayılan değerlere sahip özellikler, değerleri hesaplayan getter'lar ve hatta birbirlerini çağırabilen birden çok yöntem içerebileceğini gösteriyor. Her iki mesaj sınıfı da yalnızca with anahtar sözcüğünü kullanarak tüm bu işlevleri kazanır.
Beklenen çıktı:
>>> | Alice: Hello there!
>>> | [WARNING] **System overload**Kendin dene
import 'messaging.dart';
void main() {
// TODO: Göndereni 'Alice' olan bir TextMessage oluşturun
// TODO: Seviyesi 'WARNING' olan bir AlertMessage oluşturun
// TODO: Metin mesajı üzerinde send('Hello there!') metodunu çağırın
// TODO: Uyarı mesajı üzerinde alert('System overload') 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
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