Inheritance menghubungkan class lewat hubungan “adalah”, tetapi banyak hubungan di dunia nyata berbentuk “memiliki”: Mobil memiliki Mesin, Garasi menyimpan Mobil. Untuk hubungan semacam ini, kita menyusun object dari object lain. Ada dua pola penyusunan yang perlu dibedakan: composition untuk bagian yang menyatu dengan keseluruhannya, dan aggregation untuk bagian yang berdiri sendiri.

Composition: Bagian Dibuat di Dalam #

Pada composition, class pemilik membuat sendiri object bagian di dalamnya, biasanya lewat field dan constructor. Object bagian tidak dikenal dunia luar, dan siklus hidupnya terikat pada pemiliknya. Contohnya, Mesin pada class Mobil dibuat oleh Mobil sendiri dan tidak dimiliki pihak lain.

Aggregation: Bagian Dibuat di Luar #

Pada aggregation, object bagian dibuat di luar, lalu diterima class pemilik melalui constructor atau method. Object bagian tetap dapat dipakai meskipun hubungannya diputus, dan satu object bagian boleh dipakai lebih dari satu pemilik. Contohnya, Mobil dibuat terpisah lalu diparkir di Garasi.

Contoh: Mobil, Mesin, dan Garasi #

csharp
public class Mesin
{
    public string Tipe { get; }

    public Mesin(string tipe)
    {
        Tipe = tipe;
    }

    public void Menyala()
    {
        Console.WriteLine($"Mesin {Tipe} menyala.");
    }
}

public class Mobil
{
    private Mesin mesin;

    public Mobil()
    {
        mesin = new Mesin("Diesel 1500cc");
    }

    public void Jalan()
    {
        mesin.Menyala();
        Console.WriteLine("Mobil berjalan.");
    }
}

public class Garasi
{
    private List<Mobil> daftarMobil = new List<Mobil>();

    public void Parkir(Mobil mobil)
    {
        daftarMobil.Add(mobil);
    }

    public void TampilkanIsi()
    {
        Console.WriteLine($"Garasi berisi {daftarMobil.Count} mobil.");
    }
}

Mobil mobil = new Mobil();
mobil.Jalan();

Garasi garasi = new Garasi();
garasi.Parkir(mobil);
garasi.TampilkanIsi();

Output yang Dihasilkan:

text
Mesin Diesel 1500cc menyala.
Mobil berjalan.
Garasi berisi 1 mobil.

Mari kita bedah baris demi baris:

  1. private Mesin mesin;: Field privat membuat Mesin hanya dapat diakses dari dalam Mobil; dunia luar tidak bisa memegang mesin ini.
  2. mesin = new Mesin("Diesel 1500cc");: Mobil sendiri membuat mesinnya di dalam constructor — inilah tanda composition; tidak ada parameter mesin dari luar.
  3. mesin.Menyala();: Method Jalan() mendelegasikan sebagian pekerjaan ke object bagian, pola yang lazim disebut delegation.
  4. public void Parkir(Mobil mobil): Garasi tidak membuat Mobil; object mobil datang dari luar — inilah tanda aggregation.
  5. garasi.Parkir(mobil): Object mobil yang sama masih dapat dipakai kode lain setelah diparkir, karena siklus hidupnya tidak terikat pada Garasi.

Perbandingan singkat kedua pola:

AspekCompositionAggregation
Pembuatan bagianDi dalam class pemilikDi luar, diterima lewat parameter
Siklus hidup bagianTerikat pada pemilikMandiri
KepemilikanEksklusif untuk satu pemilikDapat dibagikan
ContohMobil–MesinGarasi–Mobil

Kedua pola membangun program dari object yang saling bekerja sama, dan keduanya melengkapi inheritance alih-alih menggantikannya.