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 Card
hanya 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). PartialCard
memiliki dua metode tambahan:PartialCard otherPart()
dan boolean isFirstPart()
.
Perwakilan
Jika saya memiliki setumpuk, itu harus terdiri dari WholeCard
s, bukan Card
s, sebagai a Card
bisa 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 Card
akan memiliki metode getRepresentative()
. A Representative
hampir 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 getRepresentative
sebagai return this;
.
Adapun PartialCards
, mereka tidak mewakili diri mereka sendiri, tetapi mereka memiliki eksternal Representative
yang bukan Card
, tetapi menyediakan metode untuk mengakses keduanya PartialCard
.
Saya pikir jenis hierarki ini masuk akal, tetapi rumit. Jika kita menganggap Card
s sebagai "kartu konseptual" dan Representative
s 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 PartialCard
dan WholeCards
keduanya 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 PartialCard
untuk mengakses metode tambahan mereka. Saat ini, saya menggunakan sistem yang dijelaskan di sini karena saya benar-benar tidak suka gips eksplisit. Dan seperti Card
, Representative
perlu dilemparkan ke salah satu WholeCard
atau 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.