Che cosa sono i casi "buoni" per sovraccarichi di sottotipi

0

Per spiegare cosa intendo, darò un esempio di un caso cattivo per un sovraccarico di sottotipo.

Diciamo che abbiamo una comunità di persone. E a seconda del tipo di persone nella nostra comunità, la nostra comunità ha alcune statistiche:

(in java):

public class Person {...}
public class PoliceMan extends Person {...}

public class Community {
    private List<Person> people;
    private int crimeFightingIndex;
    ...
    public void add(Person p) {
        people.add(p);
    }

    public void add(PoliceMan p) {
        crimeFightingIndex++;
        people.add(p);
    }
}

Perché è così male?:

Interrompe l'incapsulamento per il campo crimeFightingIndex , poiché è compito del chiamante passare un PoliceMan con entrambi i tipi di runtime. Modifica di crimeFightingIndex , come previsto o non:

Person p = new PoliceMan();
community.add(p); // calls the unintended method.

PoliceMan pm = new PoliceMan();
community.add(pm); // calls the intended method.

Domanda:

Quindi, se ce ne sono, quali sono i casi "buoni" che usano questo tipo di sovraccarico con un sottotipo. vale a dire dove un sovraccarico prende gli stessi argomenti ma dove uno o più di essi è un sottotipo dell'originale.

    
posta Jorn Vernee 11.04.2016 - 17:23
fonte

2 risposte

3

OO-sottotipizzazione ("ereditarietà") causa l'accoppiamento bidirezionale (inclusa la creazione del problema di classe base fragile ), rende testare più strong e indebolisce l'astrazione Dal momento che ogni caso d'uso per l'ereditarietà può essere sostituito con composizione, design-to-interface e altre forme di polimorfismo, suggerirei che non esistono "buoni" casi d'uso per tale sottotitolo.

    
risposta data 11.04.2016 - 17:50
fonte
3

A prima vista ti indirizzerei al modello Visitatore . Il pattern Visitor ti consente di invocare su una particolare sottoclasse e la sottoclasse chiamerà back su un metodo sovraccarico in base al suo tipo. Ti consente di eseguire double-dispatch o di determinare il comportamento in base ai tipi di due oggetti (al contrario di una singola chiamata polimorfica)

Vedi il link Wikipedia sopra, e in particolare nota l'esempio del codice:

public:
    // Declare overloads for each kind of a file to dispatch
    virtual void dispatch(ArchivedFile &file) = 0;
    virtual void dispatch(SplitFile &file) = 0;
    virtual void dispatch(ExtractedFile &file) = 0;
    
risposta data 11.04.2016 - 17:26
fonte

Leggi altre domande sui tag