Menu
Coddy logo textTech

Mixin'lerde on Anahtar Kelimesi

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

Bazen bir mixin'in, içine dahil edildiği sınıftaki metotları veya özellikleri kullanması gerekir. on anahtar kelimesi, bir mixin'i yalnızca belirli bir türü genişleten sınıflarla kullanılacak şekilde kısıtlamanıza olanak tanır.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Animal'dan 'name' özelliğine erişebilir
    breathe();  // Animal'ın metotlarını çağırabilir
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

on Animal bildirimi, bu mixin'in yalnızca Animal sınıfını genişleten sınıflara uygulanabileceği anlamına gelir. Bu, mixin'in Animal üyelerine erişimi olduğunu garanti eder. on olmadan, mixin name veya breathe() öğelerinin var olduğunu bilemezdi.

Kısıtlanmış bir mixin'i uyumsuz bir sınıfta kullanmaya çalışırsanız, Dart size bir derleme zamanı hatası verir:

class Robot with Swimming {}  // Hata! Robot, Animal sınıfını genişletmiyor

Bu kısıtlama, mixin'inizin işlevselliği bir temel sınıftan gelen belirli yeteneklere bağlı olduğunda yararlıdır. Daha güvenli bir sözleşme oluşturur; mixin belirli bir davranışı vaat eder, ancak yalnızca doğru şekilde çalışması için gereken temele sahip olduğunda.

challenge icon

Görev

Kolay

on anahtar kelimesinin, mixin'leri yalnızca belirli temel sınıflarla çalışacak şekilde nasıl kısıtladığını gösteren bir araç sistemi oluşturalım. Turbo boost özelliği ekleyen bir mixin oluşturacaksınız, ancak bu mixin yalnızca bir Vehicle temel sınıfını genişleten sınıflar tarafından kullanılabilecek.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • vehicles.dart: Temel sınıfınızı, kısıtlanmış mixin'inizi ve araç türlerinizi burada tanımlayın:
    • Bir String model özelliği ve bir int speed özelliği olan bir Vehicle sınıfı. Her iki değeri de alan bir yapıcı (constructor) ekleyin. [model] accelerating to [speed] km/h yazdıran bir accelerate() metodu ekleyin.
    • on anahtar kelimesini kullanarak Vehicle sınıfı ile kısıtlanmış bir TurboBoost mixin'i. Bu mixin, [model] TURBO ACTIVATED! yazdıran ve ardından accelerate() metodunu çağıran (her ikisi de on Vehicle kısıtlaması sayesinde erişilebilirdir) bir activateTurbo() metoduna sahip olmalıdır.
    • Vehicle sınıfını genişleten ve TurboBoost mixin'ini kullanan bir SportsCar sınıfı. Bir String color özelliği ekleyin. Yapıcı; model, speed ve color değerlerini almalıdır. [color] [model] ready to race! yazdıran bir showOff() metodu ekleyin.
  • main.dart: Araçlar dosyanızı içe aktarın ve kısıtlanmış mixin'in nasıl çalıştığını gösterin:
    • Modeli 'Ferrari', hızı 320 ve rengi 'Red' olan bir SportsCar oluşturun.
    • showOff() metodunu çağırın.
    • activateTurbo() metodunu çağırın.

TurboBoost mixin'i, model özelliğine erişebilir ve accelerate() metodunu çağırabilir; çünkü on Vehicle bildirimi, bu mixin'in yalnızca Vehicle sınıfını genişleten sınıflara dahil edileceğini garanti eder. Bu, mixin'in hangi yeteneklerin mevcut olduğunu tam olarak bildiği güvenli bir sözleşme oluşturur.

Beklenen çıktı:

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

Kopya kağıdı

on anahtar kelimesi, bir mixin'in yalnızca belirli bir türü genişleten sınıflarla kullanılmasını kısıtlar. Bu, mixin'in temel sınıftaki metotlara ve özelliklere güvenli bir şekilde erişmesini sağlar.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Can access 'name' from Animal
    breathe();  // Can call Animal's methods
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

on Animal bildirimi, mixin'in Animal üyelerine erişimi olduğunu garanti eder. Bu bildirim olmadan, mixin name veya breathe() üyelerinin varlığından haberdar olamazdı.

Kısıtlanmış bir mixin'i uyumsuz bir sınıfta kullanmaya çalışmak, derleme zamanı hatasına yol açar:

class Robot with Swimming {}  // Error! Robot doesn't extend Animal

Bu kısıtlama, mixin'inizin işlevselliği bir temel sınıfın belirli yeteneklerine bağlı olduğunda kullanışlıdır ve mixin ile onu kullanan sınıflar arasında daha güvenli bir sözleşme oluşturur.

Kendin dene

import 'vehicles.dart';

void main() {
  // TODO: Modeli 'Ferrari', hızı 320 ve rengi 'Red' olan bir SportsCar oluşturun
  
  // TODO: showOff() metodunu çağırın
  
  // TODO: activateTurbo() 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