Latar Belakang
Inilah masalah aktual yang sedang saya kerjakan: Saya ingin cara untuk mewakili kartu dalam permainan kartu Magic: The Gathering . Sebagian besar kartu dalam permainan adalah kartu yang tampak normal, tetapi beberapa di antaranya dibagi menjadi dua bagian, masing-masing dengan namanya sendiri. Setiap setengah dari kartu dua bagian ini diperlakukan sebagai kartu itu sendiri. Jadi untuk kejelasan, saya Cardhanya akan menggunakan untuk merujuk pada sesuatu yang merupakan kartu biasa, atau setengah dari kartu dua bagian (dengan kata lain, sesuatu dengan hanya satu nama).

Jadi kami memiliki tipe dasar, Kartu. Tujuan dari objek-objek ini adalah benar-benar hanya untuk menyimpan properti kartu. Mereka tidak benar-benar melakukan apa pun sendiri.
interface Card {
String name();
String text();
// etc
}
Ada dua subclass Card, yang saya panggil PartialCard(setengah dari kartu dua bagian) dan WholeCard(kartu biasa). PartialCardmemiliki dua metode tambahan:PartialCard otherPart() dan boolean isFirstPart().
Perwakilan
Jika saya memiliki setumpuk, itu harus terdiri dari WholeCards, bukan Cards, sebagai a Cardbisa menjadi PartialCard, dan itu tidak masuk akal. Jadi saya ingin objek yang mewakili "kartu fisik," yaitu, sesuatu yang dapat mewakili satu WholeCard, atau dua PartialCard. Untuk sementara saya memanggil tipe ini Representative, dan Cardakan memiliki metode getRepresentative(). A Representativehampir tidak akan memberikan informasi langsung pada kartu yang diwakilinya, itu hanya akan menunjukkannya kepada mereka. Sekarang, ide brilian / gila / bodoh saya (Anda memutuskan) adalah WholeCard mewarisi dari keduanya Card dan Representative. Bagaimanapun, mereka adalah kartu yang mewakili diri mereka sendiri! WholeCards dapat diimplementasikan getRepresentativesebagai return this;.
Adapun PartialCards, mereka tidak mewakili diri mereka sendiri, tetapi mereka memiliki eksternal Representativeyang bukan Card, tetapi menyediakan metode untuk mengakses keduanya PartialCard.
Saya pikir jenis hierarki ini masuk akal, tetapi rumit. Jika kita menganggap Cards sebagai "kartu konseptual" dan Representatives sebagai "kartu fisik," well, kebanyakan kartu keduanya! Saya pikir Anda dapat membuat argumen bahwa kartu fisik memang mengandung kartu konseptual, dan bahwa itu bukan hal yang sama , tetapi saya berpendapat bahwa itu memang kartu yang sama .
Kebutuhan Jenis-casting
Karena keduanya PartialCarddan WholeCardskeduanya Card, dan biasanya tidak ada alasan yang baik untuk memisahkan mereka, saya biasanya hanya bekerja dengan Collection<Card>. Jadi kadang-kadang saya perlu melakukan casting PartialCarduntuk mengakses metode tambahan mereka. Saat ini, saya menggunakan sistem yang dijelaskan di sini karena saya benar-benar tidak suka gips eksplisit. Dan seperti Card, Representativeperlu dilemparkan ke salah satu WholeCardatau Composite, untuk mengakses yang sebenarnyaCard mereka wakili.
Jadi hanya untuk ringkasan:
- Jenis dasar
Representative - Jenis dasar
Card - Tipe
WholeCard extends Card, Representative(tidak perlu akses, itu mewakili dirinya sendiri) - Tipe
PartialCard extends Card(memberikan akses ke bagian lain) - Ketik
Composite extends Representative(memberikan akses ke kedua bagian)
Apakah ini gila? Saya pikir itu benar-benar masuk akal, tapi sejujurnya saya tidak yakin.