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.