Quali sono alcuni esempi di ereditarietà classica invertita? [chiuso]

0

Esistono esempi di ereditarietà nelle lingue in cui le classi chiamano i loro metodi di sottoclassi piuttosto che i loro metodi di super classi?

Non dovrebbe comportarsi come l'ereditarietà tradizionale come la seguente.

Parent.method = function () {
    // Do things
}
Child.method = function () {
    // Do things
    super.method()
    // Do things
}

Dovrebbe invece comportarsi in questo modo.

Parent.method = function () {
    // Do things
    sub.method()
    // Do things
}
Child.method = function () {
    // Do things
}

Questo modello ha un nome?

    
posta timrwood 17.12.2013 - 18:42
fonte

2 risposte

3

Questo è comune nel Modello di strategia :

abstract class Strategy {
  void stepA();
  void stepB();

  void execute() {
    stepA();
    stepB();
  }
}

class SpecificStategy extends Strategy {
  void stepA() { ... }
  void stepB() { ... }
}

new SpecificStrategy().execute();

Anche il concetto di tratti è costruito attorno a questo: un tratto è simile a una classe base astratta in quanto può definire implementazioni e interfacce dei metodi richiesti, che una classe di implementazione deve fornire.

Alcuni sistemi oggetto come CLOS (per Common Lisp) o Alci (per Perl) hanno anche la possibilità che un metodo possa riferirsi a inner , che è l'implementazione di questo metodo in una sottoclasse. Se nessuna sottoclasse fornisce un'altra implementazione, allora è un no-op. Qui, definire un metodo con lo stesso nome è diverso dall'override del metodo. Perl esempio:

package Report {
  use Moose;

  sub display {
    say "Some title:";
    say "";
    inner();
    say " - $_" for qw< foo bar baz >;
  }
}

package SpecificReport {
  use Moose;
  extends 'Report';

  # "augment" avoids overriding the parent implementation
  augment display => sub {
    say "some paragraph";
    say "";
    inner();
  };
}

SpecificReport->display;

Output:

Some title:

some paragraph

 - foo
 - bar
 - baz
    
risposta data 17.12.2013 - 19:29
fonte
0

Il modello di strategia è più di una semplice classe genitrice che chiama i metodi di sottoclasse. È una soluzione generalizzata per iniettare il comportamento negli oggetti. Il punto della strategia e della categoria specifica è che gli oggetti di questo tipo vengono iniettati in un contesto, che quindi chiama execute () di Strategy. Nell'answer di amon, le implementazioni delle classi di Strategia implementano incidentalmente solo lo schema che è l'argomento della domanda originale. Si chiama modello di metodo Template .

Non so perché la domanda sia stata downvoted, l'OP ha buone ragioni per dubitare che il classico principio di "call super" sia naturale e che molte guide di stile di codifica oggi ne vietino l'uso richiedendo che i metodi deve essere finale o astratto.

    
risposta data 18.12.2013 - 03:28
fonte

Leggi altre domande sui tag