Menu
Coddy logo textTech

Mixin ve Kalıtım Karşılaştırması

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

Artık mixin'lerin nasıl çalıştığını öğrendiğinize göre, kalıtım yerine onları ne zaman kullanmanız gerektiğini açıklığa kavuşturalım. Temel fark, ifade ettikleri ilişkide yatar.

Kalıtım, bir "is-a" ilişkisini temsil eder. Bir Dog, bir Animal nesnesidir. Alt sınıf, üst sınıfın özelleşmiş bir versiyonudur ve yalnızca bir sınıfı genişletebilirsiniz.

Öte yandan mixin'ler, "yapabilir" ilişkisini temsil eder. Bir Dog yapabilir yüzebilir, ancak yüzmek bir köpeği tanımlayan şey değildir.

// Kalıtım: Dog bir Animal'dır
class Animal {
  String name;
  Animal(this.name);
}

class Dog extends Animal {
  Dog(String name) : super(name);
}

// Mixin: Dog yüzebilir (ancak yüzme ile tanımlanmaz)
mixin Swimming {
  void swim() => print('Swimming');
}

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

Sınıflar temel bir kimliği paylaştığında ve üst sınıfta kuruculara ihtiyaç duyduğunda kalıtımı kullanın. Ortak bir üst sınıfı paylaşmayan sınıflara yetenekler eklemek istediğinizde mixin'leri kullanın.

ÖzellikKalıtımMixin
İlişkiis-acan-do
SınırYalnızca bir üst sınıfBirden çok mixin
Oluşturucularİzin verilirİzin verilmez
Kullanım alanıUzmanlaşmaPaylaşılan davranış

En iyi tarafı mı? Her ikisini de birleştirebilirsiniz - bir sınıfı genişletebilir ve birden fazla yeteneği dahil ederek sınıflarınıza tam olarak ihtiyaç duydukları özellikleri kazandırabilirsiniz.

challenge icon

Görev

Kolay

Miras kullanımının mı yoksa mixin'lerin mi tercih edilmesi gerektiğini gösteren bir çalışan sistemi oluşturalım. “is-a” ilişkisi için bir temel sınıf, “can-do” yetenekleri için mixin'ler oluşturacak, ardından her iki yaklaşımın birlikte nasıl çalıştığını göstermek için bunları birleştireceksin.

Kodunu üç dosyada düzenleyeceksin:

  • worker.dart: Tüm çalışanların temel kimliğini oluşturan temel sınıfını tanımla:
    • Worker ve String name özelliklerine sahip bir String department sınıfı. Her iki değeri alan bir kurucu ekle. introduce() yazdıran [name] works in [department] metodunu ekle.
  • skills.dart: Çalışanların sahip olabileceği yetenekleri (“can-do” ilişkileri) temsil eden mixin'leri tanımla:
    • CanCode yazdıran writeCode() metoduna sahip bir Writing code... mixin'i
    • CanDesign yazdıran createDesign() metoduna sahip bir Creating design... mixin'i
    • CanManage yazdıran leadTeam() metoduna sahip bir Leading the team... mixin'i
  • main.dart: Her iki dosyayı içe aktar ve mirası mixin'lerle birleştiren uzmanlaşmış çalışan türleri oluştur:
    • Developer sınıfını genişleten ve Worker mixin'ini kullanan bir CanCode sınıfı
    • TechLead sınıfını genişleten ve hem Worker hem de CanCode mixin'lerini kullanan bir CanManage sınıfı
    • Developer adında, 'Alice' departmanında bir 'Engineering' oluştur
    • TechLead adında, 'Bob' departmanında bir 'Engineering' oluştur
    • Alice için: introduce(), ardından writeCode() çağrısını yap
    • Boş bir satır yazdır
    • Bob için: introduce(), ardından writeCode() ve sonra leadTeam() çağrılarını yap

Developer ve TechLead sınıflarının her ikisinin de çalışan olduğunu (miras), ancak farklı şeyler yapabildiğini (mixin'ler) görebilirsin. TechLead, çoklu kalıtıma ihtiyaç duymadan birden fazla yeteneği birleştirir.

Beklenen çıktı:

Alice works in Engineering
Writing code...

Bob works in Engineering
Writing code...
Leading the team...

Kendin dene

import 'worker.dart';
import 'skills.dart';

// TODO: Worker sınıfını genişleten ve CanCode mixin'ini kullanan bir Developer sınıfı oluşturun

// TODO: Worker sınıfını genişleten ve hem CanCode hem de CanManage mixin'lerini kullanan bir TechLead sınıfı oluşturun

void main() {
  // TODO: 'Engineering' departmanında 'Alice' adında bir Developer oluşturun
  
  // TODO: Alice için introduce() ve ardından writeCode() metodunu çağırın
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: 'Engineering' departmanında 'Bob' adında bir TechLead oluşturun
  
  // TODO: Bob için introduce(), writeCode() ve ardından leadTeam() 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

Kendi başına pratik yap: Online Dart derleyicisi