Mantenere elenchi di oggetti, alcuni con, alcuni senza ereditarietà

2

Diciamo che ho due classi, Foo e ExtendedFoo dove ExtendedFoo eredita da Foo . Foo ha un metodo .getValue() che restituisce un numero, ExtendedFoo ha anche .increaseValue() che si aggiunge al valore memorizzato (Ovviamente, in questo esempio, ciò che fanno è completamente arbitrario). Quello che potrei voler fare è tenere traccia di diversi oggetti di ogni classe, e per tutti gli oggetti ExtendedFoo , eseguire .increaseValue() e quindi stampare cosa viene restituito da .getValue() da ogni oggetto.

Il modo in cui lo farei sarebbe qualcosa di simile al seguente:

private ArrayList<Foo> foos;
private ArrayList<ExtendedFoo> eFoos;

public static void main(String [] args) {
    foos = new ArrayList<Foo>();
    eFoos = new ArrayList<ExtendedFoo>();

    // ...
}

public void addFoo(Foo f) {
    foos.add(f);
}

public void addExtendedFoo(ExtendedFoo f) {
    eFoos.add(f);
    foos.add(f);
}

public void updateAndPrint() {
    for(ExtendedFoo ef : eFoos) {
        ef.increaseValue();
    }
    for(Foo f: foos) {
        System.out.println(f.getValue());
    }
}

Ovviamente, i problemi ovvi con questo sono che il programmatore potrebbe finire per chiamare accidentalmente addFoo() e addExtendedFoo() senza rendersi conto del vero scopo. Se non dovessi includere la chiamata di foos.add(f) a addExtendedFoo() , allora potrebbe passare dall'altra parte.

In che modo vorresti che ciò avvenga nel modo più sicuro possibile?

    
posta SCB 25.04.2015 - 07:01
fonte

1 risposta

2

Sembra che la ragione per cui si eredita ExtendedFoo da Foo è solo per riutilizzare il metodo getValue (), mi sembra un "odore". Potresti voler riconsiderare se si tratta di una vera relazione di ereditarietà. L'ereditarietà non dovrebbe essere sfruttata solo per riutilizzare alcuni metodi.

Nel caso in cui si desideri continuare con questo progetto, perché non utilizzare instanceof, ad esempio:

c'è solo una lista e un modo per aggiungere sia Foo che ExtendedFoo

private ArrayList<Foo> foos;

public static void main(String [] args) {
    foos = new ArrayList<Foo>();    

    // ...
}

public void addFoo(Foo f) {
    foos.add(f);
}

public void updateAndPrint() {
    for(Foo f: foos) {
        if(f instanceof ExtendedFoo) {
            f.increaseValue();
        }
    }

    for(Foo f: foos) {
        System.out.println(f.getValue());
    }
}
    
risposta data 25.04.2015 - 07:18
fonte

Leggi altre domande sui tag