Menu
Coddy logo textTech

Mixin vs Kalıtım

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

Mixin'lerin nasıl çalıştığını öğrendiğinize göre, kalıtım (inheritance) yerine ne zaman kullanılacaklarını netleştirelim. 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.

Mixins ise diğer yandan bir "yapabilir" ilişkisini temsil eder. Bir Dog 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 yapıcılara ihtiyaç duyduğunuzda kalıtım kullanın. Ortak bir atayı 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 ebeveynBirden fazla mixin
Yapıcılarİzin verilirİzin verilmez
Kullanım durumuÖzelleştirmePaylaşı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

Kalıtım (inheritance) ile mixin'lerin ne zaman kullanılacağını gösteren bir çalışan sistemi oluşturalım. "is-a" (bir ...-dır) ilişkisi için bir temel sınıf ve "can-do" (yapabilir) 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ştireceksiniz.

Kodunuzu üç dosyada organize edeceksiniz:

  • worker.dart: Tüm çalışanların temel kimliğini belirleyen temel sınıfınızı tanımlayın:
    • String name ve String department özelliklerine sahip bir Worker sınıfı. Her iki değeri de alan bir yapıcı (constructor) ekleyin. [name] works in [department] çıktısını yazdıran bir introduce() metodu ekleyin.
  • skills.dart: Çalışanların sahip olabileceği yetenekleri ("can-do" ilişkileri) temsil eden mixin'leri tanımlayın:
    • Writing code... çıktısını yazdıran writeCode() metoduna sahip bir CanCode mixin'i.
    • Creating design... çıktısını yazdıran createDesign() metoduna sahip bir CanDesign mixin'i.
    • Leading the team... çıktısını yazdıran leadTeam() metoduna sahip bir CanManage mixin'i.
  • main.dart: Her iki dosyayı da içe aktarın (import) ve kalıtım ile mixin'leri birleştiren özelleşmiş çalışan türleri oluşturun:
    • Worker sınıfını genişleten (extends) ve CanCode mixin'ini kullanan bir Developer sınıfı.
    • Worker sınıfını genişleten ve hem CanCode hem de CanManage mixin'lerini kullanan bir TechLead sınıfı.
    • 'Engineering' departmanında 'Alice' adında bir Developer oluşturun.
    • 'Engineering' departmanında 'Bob' adında bir TechLead oluşturun.
    • Alice için: önce introduce(), sonra writeCode() metodunu çağırın.
    • Boş bir satır yazdırın.
    • Bob için: önce introduce(), sonra writeCode(), ardından leadTeam() metodunu çağırın.

Hem Developer hem de TechLead sınıflarının nasıl birer çalışan (kalıtım) olduğuna, ancak farklı şeyler yapabildiklerine (mixin'ler) dikkat edin. 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...

Kopya kağıdı

Kalıtım (Inheritance) bir "is-a" (bir ...-dır) ilişkisini temsil ederken (bir alt sınıf, ebeveynin özelleşmiş bir versiyonudur), mixin'ler bir "can-do" (yapabilir) ilişkisini temsil eder (kimlik tanımlamadan yetenekler ekler).

// Inheritance: Dog IS an Animal (Köpek bir Hayvandır)
class Animal {
  String name;
  Animal(this.name);
}

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

// Mixin: Dog CAN swim (Köpek yüzebilir)
mixin Swimming {
  void swim() => print('Swimming');
}

class Dog extends Animal with Swimming {
  Dog(String name) : super(name);
}
ÖzellikKalıtım (Inheritance)Mixin
İlişkiis-a (bir ...-dır)can-do (yapabilir)
SınırYalnızca bir ebeveynBirden fazla mixin
Yapıcılar (Constructors)İzin verilirİzin verilmez
Kullanım durumuÖzelleştirmePaylaşılan davranış

Her iki yaklaşımı da birleştirebilirsiniz - bir sınıfı genişletip (extend) birden fazla yeteneği dahil edebilirsiniz (mix in):

class TechLead extends Worker with CanCode, CanManage {
  TechLead(String name, String department) : super(name, department);
}

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