Sfondo
Ecco il problema reale su cui sto lavorando: voglio un modo per rappresentare le carte nel gioco di carte Magic: The Gathering . La maggior parte delle carte nel gioco sono carte dall'aspetto normale, ma alcune sono divise in due parti, ognuna con il proprio nome. Ogni metà di queste carte in due parti viene considerata come una carta stessa. Quindi, per chiarezza, userò Card
solo per fare riferimento a qualcosa che è una carta normale o metà di una carta a due parti (in altre parole, qualcosa con un solo nome).
Quindiabbiamountipobase,Card.Loscopodiquestioggettièinrealtàsoloquellodimantenereleproprietàdellacarta.Nonfannonulladasoli.
interfaceCard{Stringname();Stringtext();//etc}
CisonoduesottoclassidiCard
,chestochiamandoPartialCard
(metàdiunacartaadueparti)eWholeCard
(unacartanormale).PartialCard
haduemetodiaggiuntivi:PartialCardotherPart()
ebooleanisFirstPart()
.
Rappresentanti
Sehounmazzo,dovrebbeesserecompostodaWholeCard
s,nonCard
s,inquantoCard
potrebbeessereunPartialCard
,equestononavrebbesenso.Quindivogliounoggettocherappresentiuna"carta fisica", cioè qualcosa che possa rappresentare un WholeCard
o due PartialCard
s. Chiamerò provvisoriamente questo tipo Representative
e Card
avrà il metodo getRepresentative()
. Un Representative
non fornirebbe quasi nessuna informazione diretta sulla / e carta / e che rappresenta, verrebbe solo ad essa / loro. Ora, la mia idea geniale / pazza / stupida (decidi tu) è che WholeCard eredita da entrambi Card
e Representative
. Dopotutto, sono carte che rappresentano se stesse! WholeCards potrebbe implementare getRepresentative
come return this;
.
Come per PartialCards
, non rappresentano se stessi, ma hanno un Representative
esterno che non è un Card
, ma fornisce metodi per accedere ai due PartialCard
s.
Penso che questo tipo di gerarchia abbia senso, ma è complicato. Se pensiamo a Card
s come "carte concettuali" e Representative
s come "carte fisiche", beh, la maggior parte delle carte sono entrambe! Penso che potresti argomentare che le carte fisiche in effetti contengono carte concettuali, e che non sono la stessa cosa , ma direi che lo sono.
Necessità di type-casting
Poiché PartialCard
s e WholeCards
sono entrambi Card
s, e di solito non ci sono buoni motivi per separarli, normalmente lavorerei con Collection<Card>
. Quindi a volte avrei bisogno di lanciare PartialCard
s per accedere ai loro metodi aggiuntivi. In questo momento, sto usando il sistema descritto qui perché in realtà non mi piacciono i cast espliciti. E come Card
, Representative
avrebbe bisogno di essere castato a WholeCard
o Composite
, per accedere al% effettivo di% di% che rappresentano.
Quindi, solo per il sommario:
- Tipo di base
Card
- Tipo di base
Representative
- Digita
Card
(nessun accesso necessario, rappresenta se stesso) - Digita
WholeCard extends Card, Representative
(dà accesso ad altra parte) - Digita
PartialCard extends Card
(consente di accedere ad entrambe le parti)
Questo è folle? Penso che abbia davvero molto senso, ma onestamente non ne sono sicuro.