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, 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.

challenge icon

Görev

Kolay

Metotlar, ö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 Formattable mixin'i:
      • '>>>' değerine atanmış bir String prefix özelliği
      • ' | ' döndüren bir separator getter'ı
      • [prefix][separator][text] dizesini döndüren bir format(String text) metodu
      • **[text]** döndüren bir formatBold(String text) metodu
    • Formattable mixin'ini kullanan bir TextMessage sınıfı. Bir yapıcı (constructor) ile birlikte bir String sender özelliği ekleyin. [sender]: [content] ile format() metodunu çağıran ve sonucu yazdıran bir send(String content) metodu ekleyin.
    • Yine Formattable mixin'ini kullanan bir AlertMessage sınıfı. Bir yapıcı ile birlikte bir String level özelliği ekleyin. [[level]] [formatBold(content)] ile format() metodunu çağıran ve sonucu yazdıran bir alert(String content) metodu ekleyin.
  • 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 bir TextMessage oluşturun
    • Seviyesi 'WARNING' olan bir AlertMessage oluşturun
    • Metin mesajı üzerinde send('Hello there!') metodunu çağırın
    • Uyarı mesajı üzerinde alert('System overload') metodunu çağırın

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
}
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