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 #
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:
Mesin Diesel 1500cc menyala.
Mobil berjalan.
Garasi berisi 1 mobil.Mari kita bedah baris demi baris:
private Mesin mesin;: Field privat membuatMesinhanya dapat diakses dari dalamMobil; dunia luar tidak bisa memegang mesin ini.mesin = new Mesin("Diesel 1500cc");:Mobilsendiri membuat mesinnya di dalam constructor — inilah tanda composition; tidak ada parameter mesin dari luar.mesin.Menyala();: MethodJalan()mendelegasikan sebagian pekerjaan ke object bagian, pola yang lazim disebut delegation.public void Parkir(Mobil mobil):Garasitidak membuatMobil; object mobil datang dari luar — inilah tanda aggregation.garasi.Parkir(mobil): Objectmobilyang sama masih dapat dipakai kode lain setelah diparkir, karena siklus hidupnya tidak terikat padaGarasi.
Perbandingan singkat kedua pola:
| Aspek | Composition | Aggregation |
|---|---|---|
| Pembuatan bagian | Di dalam class pemilik | Di luar, diterima lewat parameter |
| Siklus hidup bagian | Terikat pada pemilik | Mandiri |
| Kepemilikan | Eksklusif untuk satu pemilik | Dapat dibagikan |
| Contoh | Mobil–Mesin | Garasi–Mobil |
Kedua pola membangun program dari object yang saling bekerja sama, dan keduanya melengkapi inheritance alih-alih menggantikannya.