La Superclasse contiene un elenco di sottoclassi?

0

Per la GUI di un programma, voglio che elencherà diversi elementi, che sono tutti, da un lato di programmazione, solo sottoclassi. Possono aggiungere uno di questi elementi a un elenco. Non voglio hard-code quali sottoclassi ci sono. Quale sarebbe il modo migliore per consentire alla GUI di conoscere le sottoclassi, avendo solo la classe base a cui fare riferimento?

    
posta sinθ 21.07.2013 - 20:55
fonte

3 risposte

2

@Andrew Timson (+1) fa un punto eccellente sull'uso della riflessione (se possibile) e usando un'interfaccia.

Da un punto di vista del design orientato agli oggetti, le interfacce saranno un modo molto più piacevole per andare - a meno che, naturalmente, non ci sia abbastanza logica in comune / ereditata da garantire la sottoclasse. Questo potrebbe essere discusso come parte del " Principio di inversione delle dipendenze " al lavoro; "Dipende dalle astrazioni, non dipendere dalle concrezioni". Ti stai già inclinando verso una soluzione abbastanza pulita che aderisce a questo evitando la codifica dura, però, così bella!

In aggiunta a ciò, la riflessione potrebbe essere la strada da percorrere. Ci sono altre informazioni su quando il riflesso dovrebbe essere usato qui, su StackOverflow

Oltre a questo, potresti usare qualcosa come un Pattern osservatore adattato e avere ogni nuova istanza di una sottoclasse "register" stessa al momento dell'inizializzazione. Quindi c'è un oggetto che puoi interrogare per ottenere tutti gli oggetti in questione; potresti renderlo un Singleton per assicurarti che sia sempre accessibile per tutto il ciclo di vita dell'applicazione e per assicurarti che ci sia sempre un solo oggetto da interrogare.

Questa non è la soluzione migliore, ma è un'altra che potrebbe funzionare.

    
risposta data 22.07.2013 - 02:17
fonte
2

Prima di tutto: penso che in questo caso, piuttosto che compilare la lista con una classe / sottoclassi di essa, usare una sorta di interfaccia potrebbe essere la progettazione più appropriata.

Probabilmente il miglior approccio dipenderà dalla tua lingua. Se supporta la riflessione (come C # o Java), potresti essere in grado di cercare altre classi che sottoclasse / implementano la tua interfaccia.

Se non lo è - o se vuoi una soluzione più semplice - puoi semplicemente mantenere l'elenco dei tipi disponibili in una sorta di file di configurazione / tabella che viene letto in fase di runtime.

    
risposta data 22.07.2013 - 01:29
fonte
1

puoi farlo:

import java.util.*;
class Super {
    Super() {
        subclasses.add(getClass());
    }
    static List<Object> subclasses=new LinkedList<Object>();
}
class Sub1 extends Super {
}
class Sub2 extends Super {
}
public class P205597 {
    public static void main(String[] args) {
        new Sub1();
        new Sub2();
        System.out.println(Super.subclasses);
    }
}
    
risposta data 22.07.2013 - 07:36
fonte

Leggi altre domande sui tag