sfondo
Ecco il vero problema sul quale 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 trattata come una carta stessa. Quindi, per chiarezza, userò Card
solo per fare riferimento a qualcosa che è una carta normale o metà di una carta in due parti (in altre parole, qualcosa con un solo nome).
Quindi abbiamo un tipo di base, il card. Lo scopo di questi oggetti è proprio quello di contenere le proprietà della carta. Non fanno davvero nulla da soli.
interface Card {
String name();
String text();
// etc
}
Esistono due sottoclassi di Card
, che sto chiamando PartialCard
(metà di una carta in due parti) e WholeCard
(una carta normale). PartialCard
ha due metodi aggiuntivi: PartialCard otherPart()
e boolean isFirstPart()
.
rappresentanti
Se ho un mazzo, dovrebbe essere composto da WholeCard
s, non da Card
s, come Card
potrebbe essere a PartialCard
, e non avrebbe senso. Quindi voglio un oggetto che rappresenti una "carta fisica", cioè qualcosa che possa rappresentare una WholeCard
o due PartialCard
s. Sto provvisoriamente chiamando questo tipo Representative
e Card
avrei il metodo getRepresentative()
. A Representative
non fornirebbe quasi nessuna informazione diretta sulla o sulle carte che rappresenta, indicherà solo loro. Ora, la mia idea geniale / pazza / stupida (decidi) è che WholeCard eredita da entrambi Card
e Representative
. Dopotutto, sono carte che si rappresentano! WholeCard potrebbe implementare getRepresentative
come return this;
.
Per quanto riguarda PartialCards
, non rappresentano se stessi, ma hanno un esterno Representative
che non è un Card
, ma fornisce metodi per accedere alle due PartialCard
s.
Penso che questa gerarchia di tipi abbia senso, ma è complicata. 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 contengono effettivamente carte concettuali e che non sono la stessa cosa , ma direi che lo sono.
Necessità della fusione del tipo
Perché PartialCard
s e WholeCards
sono entrambi Card
s, e di solito c'è nessuna buona ragione per separare fuori, avrei normalmente solo lavorare con Collection<Card>
. Quindi a volte dovrei lanciare PartialCard
s per accedere ai loro metodi aggiuntivi. In questo momento, sto usando il sistema descritto qui perché non mi piacciono davvero i cast espliciti. E come Card
, Representative
dovrebbe essere lanciato su uno WholeCard
o Composite
, per accedere ai messaggi reali Card
che rappresentano.
Quindi, solo per un riepilogo:
- Tipo di base
Representative
- Tipo di base
Card
- Tipo
WholeCard extends Card, Representative
(nessun accesso necessario, rappresenta se stesso) - Tipo
PartialCard extends Card
(dà accesso ad altra parte) - Tipo
Composite extends Representative
(dà accesso ad entrambe le parti)
È folle? Penso che abbia davvero molto senso, ma sinceramente non ne sono sicuro.