Un oggetto può chiamare un metodo sul suo discendente immediato? [chiuso]

1

Ho una gerarchia di ereditarietà tre in profondità: una classe di base astratta, da cui ricavo un'altra classe astratta, la chiamo classe intermedia, da cui deriverò probabilmente una grande varietà di classi derivate.

A un certo punto, la classe base chiama un metodo this.GenerateXml() , implementato nella classe derivata, che non restituisce nulla, ma scrive xml in una proprietà pubblica. A questo punto, vorrei che la classe intermedia facesse qualcosa, senza che la classe base o la classe derivata dovessero chiamare un metodo specifico sulla classe intermedia.

Questo è possibile nelle lingue OO? I costruttori si richiamano l'un l'altro sulla catena dell'eredità. Metodi possono? Un oggetto può chiamare un metodo sul suo discendente immediato? La lingua in questo caso è C #

La soluzione ovvia è chiamare un metodo, forse un metodo con lo stesso nome, dalla classe derivata, usando "base". Questo non è l'ideale, perché ogni classe derivata deve ricordarsi di effettuare la chiamata.

    
posta bbsimonbb 27.05.2014 - 10:55
fonte

2 risposte

7

Penso che quello che stai cercando sia il modello di metodo Template . In una classe astratta si definisce lo schema generale di ciò che deve essere fatto chiamando metodi più piccoli e più a grana fine. Uno (o più) di questi metodi è astratto e deve quindi essere implementato ereditando le classi.

abstract class Vehicle {
    public void drive() {
        startEngine();
        goForward();
        stopEngine();
    }

    protected abstract void goForward();

    private void startEngine() {
        ...
    }

    private void stopEngine() {
        ...
    }
}

Tutte le classi ereditanti implementano il metodo goForward() mentre solo drive() è visibile pubblicamente. Vehicle definisce quindi come funziona in generale mentre un Car o Truck implementa il movimento effettivo.

La tua richiesta sembra essere un po 'più complessa usando un altro livello di ereditarietà. Ma, in generale, non vedo un problema con un'altra classe astratta intermedia che passa il metodo astratto ancora più in basso, o addirittura la implementa usando di nuovo il modello del metodo template.

    
risposta data 27.05.2014 - 12:03
fonte
1

... the base class calls a this.GenerateXml() method, implemented in the derived class, that returns nothing, but writes xml to a public property. At this point, I would like the intermediate class to do some stuff, without the base class or the derived class having to call a specific method on the intermediate class.

Quando una delle tue classi chiama "this.GenerateXml ()", il tuo programma utilizzerà la prima implementazione di quel metodo che può trovare, a partire dalla classe corrente e lavorando verso l'alto attraverso la catena dell'eredità - Derivato, Intermedio, Base. Quindi, quello che stai cercando funzionerà solo se la classe derivata non implementa GenerateXml.

La domanda è, qual è questa "roba" che vuoi fare? È qualcosa che potrebbe cambiare dall'implementazione all'attuazione? In tal caso, dovrebbe essere definito nella classe base come un metodo protetto, virtuale (non astratto) implementato dalla classe intermedia. Ovviamente, dovrai cambiare la classe Base per chiamare questo nuovo metodo al momento giusto.

    
risposta data 27.05.2014 - 14:30
fonte

Leggi altre domande sui tag