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.
| Özellik | Kalıtım | Mixin |
|---|---|---|
| İlişki | is-a | can-do |
| Sınır | Yalnızca bir üst sınıf | Birden çok mixin |
| Oluşturucular | İzin verilir | İzin verilmez |
| Kullanım alanı | Uzmanlaşma | 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
KolayMiras 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:WorkerveString nameözelliklerine sahip birString departmentsı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:CanCodeyazdıranwriteCode()metoduna sahip birWriting code...mixin'iCanDesignyazdırancreateDesign()metoduna sahip birCreating design...mixin'iCanManageyazdıranleadTeam()metoduna sahip birLeading 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:Developersınıfını genişleten veWorkermixin'ini kullanan birCanCodesınıfıTechLeadsınıfını genişleten ve hemWorkerhem deCanCodemixin'lerini kullanan birCanManagesınıfıDeveloperadında,'Alice'departmanında bir'Engineering'oluşturTechLeadadında,'Bob'departmanında bir'Engineering'oluştur- Alice için:
introduce(), ardındanwriteCode()çağrısını yap - Boş bir satır yazdır
- Bob için:
introduce(), ardındanwriteCode()ve sonraleadTeam()ç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
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi