Menu
Coddy logo textTech

Mixin'lere Giriş

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

Dart'ın yalnızca bir sınıfı genişletmeye izin verdiğini ve birden fazla arayüzü uygulayabilseniz de tüm kodu kendiniz yazmanız gerektiğini öğrendiniz. Peki ya gerçek uygulama kodunu birbiriyle ilişkisiz birden fazla sınıf arasında paylaşmak isterseniz? İşte burada devreye mixins (mixin'ler) giriyor.

Bir mixin, kodu birden fazla sınıf hiyerarşisinde yeniden kullanmanın bir yoludur. Bunu, herhangi bir sınıfa "karıştırabileceğiniz" (mix into), kalıtım kullanmadan ona yeni yetenekler kazandıran bir metot ve özellik demeti olarak düşünün.

mixin Swimming {
  void swim() {
    print('Swimming through the water');
  }
}

class Duck with Swimming {
  void quack() {
    print('Quack!');
  }
}

class Fish with Swimming {
  void blowBubbles() {
    print('Blub blub');
  }
}

void main() {
  var duck = Duck();
  duck.quack();
  duck.swim();  // Mixin'den
  
  var fish = Fish();
  fish.swim();  // Aynı uygulama, farklı sınıf
}

with anahtar kelimesine dikkat edin - bir sınıfa mixin'i bu şekilde uygularsınız. implements aksine, metodu kendiniz yazmanıza gerek yoktur. Mixin gerçek kodu sağlar ve sınıfınız bu işlevselliği otomatik olarak kazanır.

Mixin'ler gerçek bir sorunu çözer: Duck ve Fish kalıtım yoluyla ilişkili değildir, ancak her ikisinin de yüzme davranışına ihtiyacı vardır. Mixin'ler ile kodu bir kez yazarsınız ve ihtiyaç duyulan her yerde paylaşırsınız.

challenge icon

Görev

Kolay

Mixin'lerin ilişkisiz sınıflar arasında davranışı paylaşmanıza nasıl olanak tanıdığını gösteren bir müzik aleti sistemi oluşturalım. Akort etme işlevselliği sağlayan bir mixin oluşturacak, ardından bunu kalıtım yoluyla ilişkili olmayan farklı enstrümanlara uygulayacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • instruments.dart: Mixin'inizi ve enstrüman sınıflarınızı burada tanımlayın:
    • Tuning the instrument... yazdıran bir tune() metoduna ve Tuning is perfect! yazdıran bir checkTuning() metoduna sahip bir Tunable mixin'i.
    • Tunable mixin'ini kullanan bir Guitar sınıfı. Yapıcı (constructor) ile birlikte bir String brand özelliği ekleyin. [brand] guitar strumming chords yazdıran bir strum() metodu ekleyin.
    • Yine Tunable mixin'ini kullanan bir Piano sınıfı. Yapıcı ile birlikte bir int keys özelliği ekleyin. Playing [keys]-key piano yazdıran bir play() metodu ekleyin.
  • main.dart: Enstrüman dosyanızı içe aktarın ve her iki ilişkisiz enstrümanın aynı mixin'den nasıl akort yetenekleri kazandığını gösterin:
    • 'Fender' markasına sahip bir Guitar oluşturun.
    • 88 tuşlu bir Piano oluşturun.
    • Gitar için: tune(), ardından strum() ve sonra checkTuning() metodlarını çağırın.
    • Boş bir satır yazdırın.
    • Piyano için: tune(), ardından play() ve sonra checkTuning() metodlarını çağırın.

Guitar ve Piano sınıflarının aralarında hiçbir kalıtım ilişkisi olmayan tamamen farklı enstrümanlar olmasına rağmen, her ikisinin de Tunable mixin'inden tamamen aynı akort metodlarını nasıl kazandığına dikkat edin. Akort kodunu bir kez yazarsınız ve her iki sınıf da with anahtar kelimesiyle bunu kullanabilir.

Beklenen çıktı:

Tuning the instrument...
Fender guitar strumming chords
Tuning is perfect!

Tuning the instrument...
Playing 88-key piano
Tuning is perfect!

Kopya kağıdı

Bir mixin, kalıtım kullanmadan birden fazla ilişkisiz sınıf arasında kodu yeniden kullanmanın bir yoludur. Herhangi bir sınıfa "karıştırabileceğiniz" (mix into) bir metot ve özellik paketidir.

mixin anahtar kelimesini kullanarak bir mixin tanımlayın:

mixin Swimming {
  void swim() {
    print('Swimming through the water');
  }
}

with anahtar kelimesini kullanarak bir sınıfa mixin uygulayın:

class Duck with Swimming {
  void quack() {
    print('Quack!');
  }
}

class Fish with Swimming {
  void blowBubbles() {
    print('Blub blub');
  }
}

implements aksine, metot uygulamasını kendiniz yazmanıza gerek yoktur - mixin gerçek kodu sağlar ve sınıfınız bu işlevselliği otomatik olarak kazanır.

Hem Duck hem de Fish, kalıtım yoluyla ilişkili olmasalar bile artık swim() metodunu kullanabilir:

var duck = Duck();
duck.swim();  // From the mixin

var fish = Fish();
fish.swim();  // Same implementation, different class

Kendin dene

import 'instruments.dart';

void main() {
  // TODO: 'Fender' markalı bir Guitar oluştur
  
  // TODO: 88 tuşlu bir Piano oluştur
  
  // TODO: Gitar için: tune(), ardından strum() ve sonra checkTuning() fonksiyonlarını çağır
  
  // TODO: Boş bir satır yazdır
  
  // TODO: Piyano için: tune(), ardından play() ve sonra checkTuning() fonksiyonlarını çağır
}
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