Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Composition 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 CPU sınıfı; bu sınıfta bir String brand ve bir double speedGHz bulunsun. process() dizesini döndüren bir [brand] processing at [speedGHz]GHz yöntemi ekleyin
    • Bir Memory sınıfı; bu sınıfta bir int sizeGB bulunsun. load() dizesini döndüren bir Loading [sizeGB]GB of data yöntemi ekleyin
  • computer.dart: Bileşenleri bir araya getirmek için composition kullanan bir Computer sınıfı oluşturun. Bilgisayarınız:
    • Bir String name alanına sahip olmalı
    • Bir CPU ve bir Memory ö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ından starting..., 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
  • main.dart: Dosyalarınızı içe aktarın ve composition kullanımını gösterin:
    • Computer GHz hızında çalışan bir Workstation CPU'ya ve Intel GB belleğe sahip, 3.5 adlı bir 16 oluşturun
    • boot() yöntemini çağırın
    • specs() 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 RAM

Kendin 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
}
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

Kendi başına pratik yap: Online Dart derleyicisi