Menu
Coddy logo textTech

Kompozisyon ve Kalıtım Karşılaştırması

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 76 / 104.

Sınıflar arasındaki ilişkileri tasarlarken iki temel seçeneğiniz vardır: kalıtım ("is-a") ve composition ("has-a"). Doğru yaklaşımı seçmek, kodunuzun esnekliğini ve sürdürülebilirliğini önemli ölçüde etkiler.

Kalıtım, sınıflar arasında sıkı bir bağımlılık oluşturur. Vehicle sınıfından kalıtım alan bir Car, bu ilişkiye kalıcı olarak bağlıdır:

class Vehicle {
public:
    virtual void start() { std::cout << "Starting vehicle\n"; }
};

class Car : public Vehicle {
public:
    void start() override { std::cout << "Starting car\n"; }
};

Bileşim, nesneleri üyeler olarak gömer ve daha esnek bir ilişki oluşturur. Bir Car Engine olmak yerine bir Engine has:

class Engine {
public:
    void start() { std::cout << "Engine running\n"; }
};

class Car {
private:
    Engine engine;  // Car bir Engine'e SAHİP
public:
    void start() { engine.start(); }
};

Bileşimin temel avantajı esnekliktir. Bileşenleri kolayca değiştirebilir, çalışma zamanında davranışı değiştirebilir veya katı bir sınıf hiyerarşisinin kısıtlamaları olmadan birden çok yeteneği birleştirebilirsiniz. Modern C++ tasarımı çoğu durumda kalıtım yerine bileşimi tercih eder.

Gerçek bir "bir-şeydir" ilişkisi olduğunda ve polimorfizme ihtiyaç duyduğunda kalıtımı kullan. İşlevselliği yeniden kullanmak istediğinde veya ilişkiyi "sahiptir" ya da "kullanır" şeklinde tanımlamak daha uygunsa kompozisyonu kullan.

challenge icon

Görev

Kolay

Bir bilgisayarın kalıtım yerine bileşime ne zaman ihtiyaç duyduğunu gösteren bir bilgisayar sistemi simülatörü oluşturalım. Bir bileşen olmak yerine bileşenlere sahip olan bir bilgisayarı modelleyecek ve bileşimin parçaları çalışma zamanında değiştirme esnekliği sağladığını göstereceksin.

Kodunu üç dosya arasında düzenleyeceksin:

  • Components.h: Bir bilgisayarın içerebileceği bağımsız bileşenleri tanımla.

    Özel CPU ve std::string model alanlarına sahip bir int cores sınıfı oluştur. Her iki değeri alan bir kurucu, process() yazdıran bir CPU [model] processing with [cores] cores metodu ve bir getModel() metodu sağla.

    Özel bir Memory alanına sahip bir int sizeGB sınıfı oluştur. Bir kurucu, load() yazdıran bir Loading data into [sizeGB]GB RAM metodu ve bir getSize() metodu sağla.

    Storage (örneğin "SSD" veya "HDD") ve std::string type alanlarına sahip bir int capacityGB sınıfı oluştur. Bir kurucu, read() yazdıran bir Reading from [capacityGB]GB [type] metodu ve her iki alan için getter metotları sağla.

  • Computer.h: Bileşenleri birleştirmek için bileşimi kullanan bir Computer sınıfı tanımla.

    Computer sınıfın özel üye nesneleri olarak bir CPU, bir Memory ve bir Storage içermeli. Bu bileşenleri parametrelerden başlatmak için kurucu başlatma listesini kullan.

    Şu metotları uygula:

    • boot(): Booting computer... yazdırır; ardından her birini ayrı satırda olacak şekilde bellek üzerinde load(), depolama üzerinde read() ve CPU üzerinde process() çağırır
    • specs(): bilgisayarın özelliklerini şu biçimde yazdırır:
      Computer Specs:
      - CPU: [model] ([cores] cores)
      - RAM: [size]GB
      - Storage: [capacity]GB [type]
  • main.cpp: Altı girdi oku (her biri ayrı bir satırda):
    1. CPU model adı (string)
    2. CPU çekirdek sayısı (tam sayı)
    3. GB cinsinden bellek boyutu (tam sayı)
    4. Depolama türü (string, örneğin "SSD")
    5. GB cinsinden depolama kapasitesi (tam sayı)
    6. Bir komut: "boot" veya "specs"

    Bileşen nesnelerini oluştur, ardından bileşimi kullanarak bir Computer oluştur. Komuta bağlı olarak boot() veya specs() çağrısını yap.

Örneğin Intel i7, 8, 16, SSD, 512 ve boot girdileriyle:

Booting computer...
Loading data into 16GB RAM
Reading from 512GB SSD
CPU Intel i7 processing with 8 cores

AMD Ryzen, 6, 32, HDD, 1000 ve specs girdileriyle:

Computer Specs:
- CPU: AMD Ryzen (6 cores)
- RAM: 32GB
- Storage: 1000GB HDD

Computer sınıfının herhangi bir bileşenden kalıtım almadığına dikkat et. Bileşenleri içerir. Bu "sahiptir" ilişkisi, farklı bileşen kombinasyonlarına sahip bilgisayarları kolayca oluşturabileceğin veya setter metotları eklersen bileşenleri daha sonra değiştirebileceğin anlamına gelir. Bu esneklik, bileşimin kalıtıma göre temel avantajıdır.

Kendin dene

#include <iostream>
#include <string>
#include "Computer.h"

using namespace std;

int main() {
    // Girdileri oku
    string cpuModel;
    getline(cin, cpuModel);  // CPU model adı (boşluk içerebilir)
    
    int cpuCores;
    cin >> cpuCores;  // CPU çekirdek sayısı
    
    int memorySize;
    cin >> memorySize;  // Bellek boyutu GB cinsinden
    
    string storageType;
    cin >> storageType;  // Depolama türü (örn., "SSD")
    
    int storageCapacity;
    cin >> storageCapacity;  // Depolama kapasitesi GB cinsinden
    
    string command;
    cin >> command;  // Komut: "boot" veya "specs"

    // TODO: Bileşen nesnelerini oluştur (CPU, Memory, Storage)
    
    // TODO: Kompozisyon kullanarak bir Computer nesnesi oluştur
    
    // TODO: Komuta göre boot() veya specs() çağır

    return 0;
}
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 C++ derleyicisi