Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Bir 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 brand ve double speedGHz alanlarına sahip bir CPU sınıfı. Bir string döndüren process() metodunu ekle: [brand] processing at [speedGHz]GHz
    • int sizeGB alanına sahip bir Memory sınıfı. Bir string döndüren load() metodunu ekle: Loading [sizeGB]GB of data
  • computer.dart: Bileşenleri bir araya getirmek için composition kullanan bir Computer sınıfı oluştur. Bilgisayarın:
    • Bir String name alanı olsun
    • Bir CPU ve bir Memory ö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ından starting..., 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
  • main.dart: Dosyalarını içe aktar ve composition'ı uygulamalı olarak göster:
    • Workstation adında bir Computer oluştur. Intel CPU'su 3.5 GHz hızında çalışsın ve 16 GB belleği olsun
    • boot() metodunu çağır
    • specs() 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 RAM

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