Stessa interfaccia per classi con alcuni attributi comuni

0

Sto lavorando a un progetto per il mio college e sono bloccato su questo problema nel mio progetto. In questo momento ho qualcosa di simile:

public abstract class AbstractClass {
    protected SomeClass attributeOne;
    protected SomeClass2 attributeTwo;

    public SomeClass getAttributeOne() { // code }
    public SomeClass2 getAttributeTwo() { // code }

    public void setAttributeOne(...) { // code }
    public void setAttributeTwo(...) { // code }
}

public class ChildClassOne extends AbstractClass {
    private SomeOtherClass childOneAttributeOne;

    public SomeOtherClass getChildOneAttributeOne() { // code }

    public void setChildOneAttributeOne(...) { // code }
}

public class ChildClassTwo extends AbstractClass {
    private SomeOtherClass childTwoAttributeOne;
    private SomeOtherClass2 childTwoAttributeTwo;

    public SomeOtherClass getChildTwoAttributeOne() { // code }
    public SomeOtherClass2 getChildTwoAttributeTwo() { // code }

    public void setChildTwoAttributeOne(...) { // code }
    public void setChildTwoAttributeTwo(...) { // code }
}

In un'altra classe con un livello più alto di astrazione, ho una classe con un

private List<AbstractClass> = new ArrayList<>();

E poi quando necessario aggiungo diverse istanze di ChildClassOne e ChildClassTwo. Tuttavia, in alcuni casi ho bisogno di accedere ai diversi metodi in ogni sottoclasse, ma potrei non sapere che tipo di bambino sono (quindi non posso sempre fare un cast) e non voglio fare un cambio di InstanceOf. Mi sento solo male. Un altro problema è che ho molte sottoclassi, quindi non posso dichiarare un attributo per ognuna di esse.

Come possibili soluzioni, ho visto l'adattatore e il pattern composito, ma non so davvero se sono l'approccio corretto, se c'è una soluzione migliore o se il mio design è totalmente sbagliato.

EDIT: Sì, devo usare Java per questo progetto

EDIT2: caso d'uso effettivo

Collegamento a un esempio semplificato:

Ho un gruppo di carte diverse, con alcuni attributi di base. E ho due classi contenenti un elenco di carte (nell'esempio è solo uno (CardContainer) per semplicità). La carta è la classe astratta e CardWithAction e CardWithBonus sono i miei figli (in realtà sono 4 al momento). In una delle classi "container" ho solo bisogno di accedere ai metodi della classe genitore (Card), quindi non ci sono problemi al momento. Ma nell'altro "contenitore" potrei aver bisogno di accedere ai metodi dei bambini, considerando che la maggior parte delle volte mi piacerebbe trattarli come un singolo oggetto.

    
posta Champ 17.05.2017 - 22:38
fonte

1 risposta

0

Ti suggerisco di mantenere le cose semplici e usare la composizione invece dell'ereditarietà, come ho scritto in un commento. Invece di avere classi CardWithAction e CardWithBonus , crea una classe Action e una classe Bonus , e rendi il tuo Card opzionalmente contenente un riferimento a un oggetto Bonus e un riferimento facoltativo a un Action oggetto.

Durante l'iterazione su un contenitore di carte, puoi semplicemente controllare azioni come

  if(card.getAction()!=null)
  {
       // do something with card.getAction().getReward();
  }

Ciò eviterà la necessità di cast o "InstanceOf". Come "bonus" (gioco di parole), ora puoi avere una carta con un'azione e un bonus , nel caso ti serva.

    
risposta data 18.05.2017 - 21:52
fonte

Leggi altre domande sui tag