Menu
Coddy logo textTech

Birden Fazla Mixin Kullanımı

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 52 / 110.

Tıpkı birden fazla arayüz uygulayabildiğiniz gibi, tek bir sınıfa birden fazla mixin de uygulayabilirsiniz. Bunları with anahtar kelimesinden sonra virgülle ayırarak listelemeniz yeterlidir.

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

mixin Walking {
  void walk() => print('Walking');
}

class Duck with Swimming, Flying, Walking {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // Swimming mixin'inden
  duck.fly();    // Flying mixin'inden
  duck.walk();   // Walking mixin'inden
  duck.quack();  // Duck sınıfından
}

Aynı isme sahip metotları olduğunda mixin'lerin sırası önemlidir. Listedeki son mixin kazanır:

mixin A {
  void greet() => print('Hello from A');
}

mixin B {
  void greet() => print('Hello from B');
}

class MyClass with A, B {}

void main() {
  MyClass().greet();  // Çıktı: Hello from B
}

B, A'dan sonra geldiği için, greet() metodu öncelik kazanır. Bu katmanlama davranışı, karmaşık kalıtım hiyerarşileri olmadan birden fazla kaynaktan gelen işlevselliği birleştirerek, tam olarak ihtiyacınız olan yeteneklere sahip sınıflar oluşturmanıza olanak tanır.

challenge icon

Görev

Kolay

Mixin'ler aracılığıyla birden fazla yeteneği birleştiren akıllı bir ev cihazı sistemi kuralım. Çeşitli akıllı özellikleri temsil eden farklı mixin'ler oluşturacak, ardından hepsini bir arada kullanan bir cihaz inşa edeceksiniz.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • smart_features.dart: Farklı akıllı ev yetenekleri sağlayan üç mixin tanımlayın:
    • Voice: [command] yazdıran voiceCommand(String command) metoduna sahip bir VoiceControl mixin'i
    • Connected to [network] yazdıran connectWiFi(String network) metoduna sahip bir WiFiEnabled mixin'i
    • Entering sleep mode... yazdıran enterSleepMode() metodu ile Waking up! yazdıran wakeUp() metoduna sahip bir PowerSaver mixin'i
    Ardından, her üç mixin'i de kullanan bir SmartSpeaker sınıfı oluşturun. Bir yapıcı (constructor) ile birlikte bir String name özelliği ekleyin ve [name] playing: [song] yazdıran bir playMusic(String song) metodu dahil edin.
  • main.dart: Akıllı özellikler dosyanızı içe aktarın ve hoparlörün tüm yetenekleri nasıl birleştirdiğini gösterin:
    • 'Echo' adında bir SmartSpeaker oluşturun
    • connectWiFi('HomeNetwork') metodunu çağırın
    • voiceCommand('Play jazz') metodunu çağırın
    • playMusic('Smooth Jazz Mix') metodunu çağırın
    • enterSleepMode() metodunu çağırın
    • wakeUp() metodunu çağırın

SmartSpeaker sınıfınız, tek bir with ifadesiyle her üç mixin'den de metodlar kazanarak, birden fazla mixin'in karmaşık kalıtım süreçlerine girmeden tam olarak ihtiyacınız olan yetenekleri oluşturmanıza nasıl olanak tanıdığını gösterir.

Beklenen çıktı:

Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!

Kopya kağıdı

Bir sınıf, with anahtar kelimesinden sonra virgülle ayırarak listeleyerek birden fazla mixin uygulayabilir:

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

class Duck with Swimming, Flying {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // Swimming mixin'inden
  duck.fly();    // Flying mixin'inden
  duck.quack();  // Duck sınıfından
}

Birden fazla mixin aynı ada sahip metotlara sahip olduğunda, listedeki son mixin öncelik kazanır:

mixin A {
  void greet() => print('Hello from A');
}

mixin B {
  void greet() => print('Hello from B');
}

class MyClass with A, B {}

void main() {
  MyClass().greet();  // Çıktı: Hello from B
}

Kendin dene

import 'smart_features.dart';

void main() {
  // TODO: 'Echo' adında bir SmartSpeaker oluşturun
  
  // TODO: connectWiFi('HomeNetwork') fonksiyonunu çağırın
  
  // TODO: voiceCommand('Play jazz') fonksiyonunu çağırın
  
  // TODO: playMusic('Smooth Jazz Mix') fonksiyonunu çağırın
  
  // TODO: enterSleepMode() fonksiyonunu çağırın
  
  // TODO: wakeUp() fonksiyonunu ç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