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 "is-a" ilişkisi oluşturduğunu öğrendin - bir Dog, bir Animal'dır. Ancak başka bir güçlü yaklaşım daha vardır: "has-a" ilişkisi oluşturan bileşim. Bir sınıf, davranışı devralmak yerine diğer sınıfların örneklerini içerir ve işleri onlara devreder.
Bir Car sınıfını ele alalım. Kalıtım kullanarak bir Engine sınıfını genişletmeyi deneyebilirsin; ancak araba bir motor değildir, bir motoru vardır:
class Engine {
void start() => print('Engine started');
}
class Car {
final Engine _engine = Engine(); // Kompozisyon: Car, bir Engine'e SAHİPTİR
void start() {
_engine.start(); // İşlemi engine'e devret
print('Car is ready to drive');
}
}
void main() {
var car = Car();
car.start();
}Bileşimin temel avantajı esnekliktir. Kalıtımda tek bir üst sınıfa bağlı kalırsın. Bileşimde ise birden fazla bileşeni birleştirebilir, hatta bunları çalışma zamanında değiştirebilirsin:
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 kılavuz ilke, "kalıtım yerine bileşimi tercih edin" şeklindedir. Gerçek bir "bir türüdür" ilişkisi olduğunda ve çok biçimliliğe ihtiyaç duyduğunuzda kalıtımı kullanın. Sıkı bağlılık olmadan davranışı yeniden kullanmak istediğinizde veya bir nesnenin birden fazla kaynaktan gelen yeteneklere ihtiyaç duyduğu durumlarda bileşimi kullanın.
Görev
KolayBir bilgisayar sistemini composition kullanarak oluşturalım! Bir bilgisayarın parçalarından kalıtım almasını sağlamaya çalışmak yerine, ayrı bileşen sınıfları oluşturup bunları bir araya getireceksin; çünkü bir bilgisayarın CPU'su ve belleği vardır, bilgisayar bir CPU ya da bellek değildir.
Kodunu üç dosyada düzenleyeceksin:
components.dart: Bilgisayar parçalarını temsil eden iki bileşen sınıfı oluştur:String brandvedouble speedGHzalanlarına sahip birCPUsınıfı. Bir string döndürenprocess()metodunu ekle:[brand] processing at [speedGHz]GHzint sizeGBalanına sahip birMemorysınıfı. Bir string döndürenload()metodunu ekle:Loading [sizeGB]GB of data
computer.dart: Bileşenleri bir araya getirmek için composition kullanan birComputersınıfı oluştur. Bilgisayarın:- Bir
String namealanı olsun - Bir
CPUve birMemoryörneği içersin (composition — bilgisayarın bu parçalara HAS olması) - Her iki bileşeni de kendi içinde oluşturmak için gerekli tüm değerleri constructor aracılığıyla alsın
- Her iki bileşene de işi devreden ve üç satır yazdıran bir
boot()metodu olsun: önce bilgisayarın adı ve ardındanstarting..., sonra CPU'nun process metodunun sonucu, ardından Memory'nin load metodunun sonucu - Sistemi açıklayan bir string döndüren bir
specs()metodu olsun:[name]: [brand] [speedGHz]GHz, [sizeGB]GB RAM
- Bir
main.dart: Dosyalarını içe aktar ve composition'ı uygulamalı olarak göster:Workstationadında birComputeroluştur.IntelCPU'su3.5GHz hızında çalışsın ve16GB belleği olsunboot()metodunu çağırspecs()sonucunu yazdır
Computer sınıfının CPU ya da Memory sınıfını genişletmediğine dikkat et; bunları içerir ve işi 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" adlı bir Computer oluştur; özellikleri:
// - 3.5 GHz hızında çalışan Intel CPU
// - 16 GB bellek
// TODO: boot() metodunu çağır
// TODO: specs() sonucunu yazdır
}
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