Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Yö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 Formattable mixin'i:
      • String prefix olarak başlatılan bir '>>>' özelliği
      • separator döndüren bir ' | ' getter'ı
      • format(String text) dizesini döndüren bir [prefix][separator][text] yöntemi
      • formatBold(String text) döndüren bir **[text]** yöntemi
    • TextMessage mixin'ini kullanan bir Formattable sınıfı. Bir kurucuyla birlikte String sender özelliği ekle. send(String content) ile format() çağrısının sonucunu yazdıran bir [sender]: [content] yöntemi ekle.
    • AlertMessage mixin'ini kullanan bir Formattable sınıfı. Bir kurucuyla birlikte String level özelliği ekle. alert(String content) ile format() çağrısının sonucunu yazdıran bir [[level]] [formatBold(content)] yöntemi ekle.
  • 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:
    • TextMessage gönderenine sahip bir 'Alice' oluştur
    • AlertMessage seviyesine 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
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Dart derleyicisi