Kompozisyon ve Kalıtım
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 82 / 110.
Kalıtımın bir "is-a" (bir ...-dır) ilişkisi oluşturduğunu öğrendiniz - bir Dog bir Animal'dır. Ancak başka bir güçlü yaklaşım daha vardır: bir "has-a" (bir ...-ya sahiptir) ilişkisi oluşturan kompozisyon. Bir sınıf, davranışı miras almak yerine diğer sınıfların örneklerini içerir ve işi onlara devreder.
Bir Car sınıfını düşünün. Kalıtım ile bir Engine sınıfını genişletmeye çalışabilirsiniz - ancak bir araba bir motor değildir, bir motora sahiptir:
class Engine {
void start() => print('Engine started');
}
class Car {
final Engine _engine = Engine(); // Kompozisyon: Araba bir Motora SAHİPTİR
void start() {
_engine.start(); // Motora devret
print('Car is ready to drive');
}
}
void main() {
var car = Car();
car.start();
}Kompozisyonun temel avantajı esnekliktir. Kalıtım ile tek bir üst sınıfa bağlı kalırsınız. Kompozisyon ile birden fazla bileşeni birleştirebilir ve hatta bunları çalışma zamanında değiştirebilirsiniz:
class ElectricEngine {
void start() => print('Electric motor humming');
}
class HybridCar {
Engine? _gasEngine;
ElectricEngine? _electricEngine;
HybridCar({bool useElectric = false}) {
if (useElectric) {
_electricEngine = ElectricEngine();
} else {
_gasEngine = Engine();
}
}
}Yaygın bir ilke "kalıtım yerine kompozisyonu tercih et" şeklindedir. Gerçek bir "is-a" ilişkisi olduğunda ve polimorfizme ihtiyaç duyduğunuzda kalıtımı kullanın. Davranışı sıkı bağlılık (tight coupling) olmadan yeniden kullanmak istediğinizde veya bir nesne birden fazla kaynaktan yeteneklere ihtiyaç duyduğunda kompozisyonu kullanın.
Görev
KolayComposition kullanarak bir bilgisayar sistemi oluşturalım! Bir bilgisayarı parçalarından miras almaya çalışmak yerine, ayrı bileşen sınıfları oluşturup bunları bir araya getireceksiniz; çünkü bir bilgisayar bir CPU'ya sahiptir ve belleğe sahiptir, kendisi bir CPU veya bellek değildir.
Kodunuzu üç dosyaya ayıracaksınız:
components.dart: Bilgisayar parçalarını temsil eden iki bileşen sınıfı oluşturun:- Bir
CPUsınıfı; bu sınıfta birString brandve birdouble speedGHzbulunsun.process()dizesini döndüren bir[brand] processing at [speedGHz]GHzyöntemi ekleyin - Bir
Memorysınıfı; bu sınıfta birint sizeGBbulunsun.load()dizesini döndüren birLoading [sizeGB]GB of datayöntemi ekleyin
- Bir
computer.dart: Bileşenleri bir araya getirmek için composition kullanan birComputersınıfı oluşturun. Bilgisayarınız:- Bir
String namealanına sahip olmalı - Bir
CPUve birMemoryörneği içermeli (composition - bilgisayar bu parçalara HAS) - Her iki bileşeni dahili olarak oluşturmak için gereken tüm değerleri kurucusu aracılığıyla almalı
- Her iki bileşene de işlerini devreden bir
boot()yöntemine sahip olmalı ve üç satır yazdırmalı: bilgisayarın adının ardındanstarting..., sonra CPU'nun process yönteminin sonucu, ardından Memory'nin load yönteminin sonucu - Sistemi açıklayan bir dize döndüren bir
specs()yöntemine sahip olmalı:[name]: [brand] [speedGHz]GHz, [sizeGB]GB RAM
- Bir
main.dart: Dosyalarınızı içe aktarın ve composition kullanımını gösterin:ComputerGHz hızında çalışan birWorkstationCPU'ya veIntelGB belleğe sahip,3.5adlı bir16oluşturunboot()yöntemini çağırınspecs()sonucunu yazdırın
Computer sınıfının CPU veya Memory sınıfını genişletmediğine dikkat edin; bunları içerir ve işleri onlara devreder. Composition'ın oluşturduğu "has-a" ilişkisi budur!
Beklenen çıktı:
Workstation starting...
Intel processing at 3.5GHz
Loading 16GB of data
Workstation: Intel 3.5GHz, 16GB RAMKendin dene
import 'computer.dart';
void main() {
// TODO: "Workstation" adında bir Computer oluşturun:
// - 3.5 GHz hızında çalışan Intel CPU
// - 16 GB bellek
// TODO: boot() metodunu çağırın
// TODO: specs() sonucunu yazdı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 Depolama13İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımGenişletme MetotlarıÇağrılabilir SınıflarMühürlü Sınıflar (Dart 3)Kayıtlar (Dart 3)Desenler ve Eşleştirme (3.0)Metot İçeren Enum'lar2Dart'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