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.
| Özellik | Kalıtım | Mixin |
|---|---|---|
| İlişki | is-a | can-do |
| Sınır | Yalnızca bir ebeveyn | Birden fazla mixin |
| Yapıcılar | İzin verilir | İzin verilmez |
| Kullanım durumu | Özelleştirme | Paylaşı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.
Görev
KolayKalı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 nameveString departmentözelliklerine sahip birWorkersınıfı. Her iki değeri de alan bir yapıcı (constructor) ekleyin.[name] works in [department]çıktısını yazdıran birintroduce()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ıranwriteCode()metoduna sahip birCanCodemixin'i.Creating design...çıktısını yazdırancreateDesign()metoduna sahip birCanDesignmixin'i.Leading the team...çıktısını yazdıranleadTeam()metoduna sahip birCanManagemixin'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:Workersınıfını genişleten (extends) veCanCodemixin'ini kullanan birDevelopersınıfı.Workersınıfını genişleten ve hemCanCodehem deCanManagemixin'lerini kullanan birTechLeadsınıfı.'Engineering'departmanında'Alice'adında birDeveloperoluşturun.'Engineering'departmanında'Bob'adında birTechLeadoluşturun.- Alice için: önce
introduce(), sonrawriteCode()metodunu çağırın. - Boş bir satır yazdırın.
- Bob için: önce
introduce(), sonrawriteCode(), ardındanleadTeam()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);
}| Özellik | Kalıtım (Inheritance) | Mixin |
|---|---|---|
| İlişki | is-a (bir ...-dır) | can-do (yapabilir) |
| Sınır | Yalnızca bir ebeveyn | Birden fazla mixin |
| Yapıcılar (Constructors) | İzin verilir | İzin verilmez |
| Kullanım durumu | Özelleştirme | Paylaşı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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı