Katma (Mixin)

Mixinler, kodunuzu birden çok sınıf hiyerarşisinde yeniden kullanmanın bir yoludur. Birçok üye uygulaması sağlamak amacıyla tasarlanmıştır.

Mixin kullanmak için, bir veya daha fazla mixin adından sonra gelen "with" anahtar kelimesini kullanın. Aşağıdaki örnek, iki sınıfın mixin'leri kullandığı bir durumu göstermektedir:

class Muzisyen extends PerformansSanatcisi with Muzikal {
  // ···
}

class Maestro extends Kisi with Muzikal, Agresif, Demente {
  Maestro(String maestroAdi) {
    ad = maestroAdi;
    orkestraSeftaliyor = true;
  }
}

Mixin tanımlamak için, mixin deyimini kullanın. Nadir durumlarda bir mixin ve bir sınıfı aynı anda tanımlamanız gerekiyorsa, mixin sınıfı deyimini kullanabilirsiniz.

Mixin ve mixin sınıfları "extends" kısmına sahip olamaz ve üretici kurucu bildirimi yapmamalıdır.

Örneğin:

mixin Muzikal {
  bool pianoCalabilir = false;
  bool besteYapabilir = false;
  bool orkestraSeftaliyor = false;

  void beniEglendir() {
    if (pianoCalabilir) {
      print('Piyano çalıyor');
    } else if (orkestraSeftaliyor) {
      print('Ellerini sallıyor');
    } else {
      print('Kendi kendine mırıldanıyor');
    }
  }
}

Bazen bir mixin'in kullanabileceği türleri sınırlamak isteyebilirsiniz. Örneğin, mixin, tanımlamadığı bir yöntemi çağırabilme yetisine bağlıysa, mixin'in kullanımını "on" anahtar kelimesiyle zorlayabilirsiniz:

class Muzisyen {
  // ...
}
mixin MuzikalSanatci on Muzisyen {
  // ...
}
class SarkiciDansci extends Muzisyen with MuzikalSanatci {
  // ...
}

Yukarıdaki kodda, MuzikalSanatci mixin'ini yalnızca Muzisyen sınıfını genişleten veya uygulayan sınıflar kullanabilir. Çünkü SarkiciDansci sınıfı Muzisyen'i genişlettiği için MuzikalSanatci mixin'ini kullanabilir.

Sınıf, mixin veya mixin sınıfı? (Class, Mixin or Mixin Class)

Mixin tanımı bir mixin'i belirtir. Sınıf tanımı bir sınıfı belirtir. Mixin sınıfı tanımı ise, aynı ad ve aynı türle hem düzenli bir sınıf hem de bir mixin olarak kullanılabilen bir sınıfı belirtir.

Sınıflar veya mixin'ler için geçerli olan kısıtlamalar, mixin sınıfları için de geçerlidir:

  • Mixin'lerin "extends" veya "with" kısmı olamaz, bu nedenle mixin sınıfları da olamaz.

  • Sınıfların "on" kısmı olamaz, bu nedenle mixin sınıfları da olamaz.

Soyut Mixin Sınıfı (Abstract Mixin Class)

Bir mixin sınıfının "on" direktifi için benzer bir davranışı başarabilirsiniz. Mixin sınıfını soyut yapın ve davranışının bağlı olduğu soyut yöntemleri tanımlayın:

abstract mixin class Muzisyen {
  // 'on' direktifi yok, ancak davranışının bağlı olduğu soyut bir yöntemi tanımlar:
  void enstrumanCal(String enstrumanAdi);

  void piyanoCal() {
    enstrumanCal('Piyano');
  }
  void flutCal() {
    enstrumanCal('Flüt');
  }
}

class Virtuoso with Muzisyen { // Muzisyen'i bir mixin olarak kullanın
  void enstrumanCal(String enstrumanAdi) {
    print('$enstrumanAdi güzel bir şekilde çalınıyor');
  }  
} 

class Acemi extends Muzisyen { // Muzisyen'i bir sınıf olarak kullanın
  void enstrumanCal(String enstrumanAdi) {
    print('$enstrumanAdi kötü bir şekilde çalınıyor');
  }  
}

Muzisyen mixin'ini soyut olarak tanımlayarak, onu kullanan herhangi bir türü davranışının bağlı olduğu soyut yöntemi tanımlamaya zorlarsınız.

Bu, "on" direktifinin bir mixin'in bağımlı olduğu arabirimlere erişim sağladığı şekilde benzer bir işlevi yerine getirir.

Last updated