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, bunları nasıl düzgün bir şekilde oluşturacağımıza bakalım. Bir mixin, class yerine mixin anahtar kelimesi kullanılarak bildirilir.
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}Mixin'ler, tıpkı sınıflar gibi metotlar, özellikler ve hatta getter'lar ve setter'lar içerebilir. Ancak, önemli bir kural vardır: mixin'lerin constructor'ları olamaz. Mixin'ler doğrudan örneklendirilmek yerine "dahil edilmek" (mixed in) üzere tasarlandıkları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 metodunu kullanır
print(doc.createdAt); // Mixin özelliğini kullanır
}Bir mixin'i with kullanarak uyguladığınızda, tüm üyeleri sınıfınızın bir parçası haline gelir. Sınıf bunları doğrudan kullanabilir ve bu sınıfın bir örneğine sahip olan her kod da aynısını yapabilir. Bu, mixin'leri kalıtım hiyerarşilerinin karmaşıklığı olmadan yeniden kullanılabilir işlevsellik eklemenin temiz bir yolu haline getirir.
Görev
KolayMetotlar, özellikler ve getter'lar içeren mixin'lerin nasıl oluşturulacağını gösteren bir mesajlaşma sistemi kuralım. Farklı mesaj türlerine biçimlendirme yetenekleri ekleyen bir mixin tasarlayacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
messaging.dart: Mixin'inizi ve mesaj sınıflarınızı burada tanımlayın:- Şunları içeren bir
Formattablemixin'i:'>>>'değerine atanmış birString prefixözelliği' | 'döndüren birseparatorgetter'ı[prefix][separator][text]dizesini döndüren birformat(String text)metodu**[text]**döndüren birformatBold(String text)metodu
Formattablemixin'ini kullanan birTextMessagesınıfı. Bir yapıcı (constructor) ile birlikte birString senderözelliği ekleyin.[sender]: [content]ileformat()metodunu çağıran ve sonucu yazdıran birsend(String content)metodu ekleyin.- Yine
Formattablemixin'ini kullanan birAlertMessagesınıfı. Bir yapıcı ile birlikte birString levelözelliği ekleyin.[[level]] [formatBold(content)]ileformat()metodunu çağıran ve sonucu yazdıran biralert(String content)metodu ekleyin.
- Şunları içeren bir
main.dart: Mesajlaşma dosyanızı içe aktarın ve her iki mesaj türünün de mixin'den nasıl biçimlendirme yetenekleri kazandığını gösterin:- Göndericisi
'Alice'olan birTextMessageoluşturun - Seviyesi
'WARNING'olan birAlertMessageoluşturun - Metin mesajı üzerinde
send('Hello there!')metodunu çağırın - Uyarı mesajı üzerinde
alert('System overload')metodunu çağırın
- Göndericisi
Mixin'iniz; mixin'lerin varsayılan değerlere sahip özellikler, değer hesaplayan getter'lar ve hatta birbirini çağırabilen birden fazla metot içerebileceğini gösterir. Her iki mesaj sınıfı da sadece with anahtar kelimesini kullanarak tüm bu işlevselliği kazanır.
Beklenen çıktı:
>>> | Alice: Hello there!
>>> | [WARNING] **System overload**Kopya kağıdı
Mixin'ler, class yerine mixin anahtar kelimesi kullanılarak tanımlanır:
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}Mixin'ler metotlar, özellikler, getter'lar ve setter'lar içerebilir ancak yapıcı metotlara (constructors) sahip olamazlar:
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}Mixin'leri sınıflara with anahtar kelimesini kullanarak uygulayın. Tüm mixin üyeleri sınıfın bir parçası haline gelir:
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // Uses mixin's method
print(doc.createdAt); // Uses mixin's property
}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
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ı