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ò Cardsolo 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). PartialCardha due metodi aggiuntivi: PartialCard otherPart()e boolean isFirstPart().
rappresentanti
Se ho un mazzo, dovrebbe essere composto da WholeCards, non da Cards, come Cardpotrebbe essere a PartialCard, e non avrebbe senso. Quindi voglio un oggetto che rappresenti una "carta fisica", cioè qualcosa che possa rappresentare una WholeCardo due PartialCards. Sto provvisoriamente chiamando questo tipo Representativee Cardavrei il metodo getRepresentative(). A Representativenon 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 getRepresentativecome return this;.
Per quanto riguarda PartialCards, non rappresentano se stessi, ma hanno un esterno Representativeche non è un Card, ma fornisce metodi per accedere alle due PartialCards.
Penso che questa gerarchia di tipi abbia senso, ma è complicata. Se pensiamo a Cards come "carte concettuali" e Representatives 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é PartialCards e WholeCardssono entrambi Cards, e di solito c'è nessuna buona ragione per separare fuori, avrei normalmente solo lavorare con Collection<Card>. Quindi a volte dovrei lanciare PartialCards 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, Representativedovrebbe essere lanciato su uno WholeCardo Composite, per accedere ai messaggi reali Cardche 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.