Come estendere i metodi dei genitori nelle classi per bambini?

1

Esiste una classe genitore con un metodo che molti bambini usano ma molti bambini estendono il metodo, qual è il modo migliore per estenderlo senza violare DRY?

Ecco le mie 2 soluzioni attuali:

1: Il genitore ha un metodo che chiama il codice riutilizzabile che è rilevante per tutte le sottoclassi (do_questo), quindi chiama un metodo specifico di classe che tutte le sottoclassi sostituiscono. per es.

    class Parent(object):
        def method(self):
            self.do_this()
            self.do_this_unique_to_class()

        def do_this(self):
            print 'every child wants to print this'

        def do_this_unique_to_class(self):
            pass

    class Child(object):
        def do_this_unique_class(self):
            print 'Only class Child wants to print this'

2: Basta usare super e ogni bambino sovrascrive il metodo dei genitori. Non mi piace tanto questa soluzione. per es.

    class Parent(object):
        def do_this(self):
            print 'every child wants to print this'

    class Child(object):
        def do_this(self):
            # call parents do_this
            super(Child, self).do_this()
            # then extend it
            print 'Only class Child wants to print this'
    
posta Will Beauchamp 10.12.2015 - 09:58
fonte

3 risposte

1

Il problema con la tua soluzione n. 1 è che non saprai mai se in seguito avrai bisogno di un po 'di do_this_unique_class prima di do_this .

Vorrei fare qualcosa di un po 'diverso, ma un po' lungo la linea del n. 2, suddividendo il metodo do_this nel genitore in metodi che il genitore mette a disposizione dei figli e poi hanno il metodo "do_questo" dei bambini chiama i metodi di cui hanno bisogno e aggiungi la loro logica.

    
risposta data 10.12.2015 - 12:28
fonte
1

Il secondo è meglio. Significa che non ci sono metodi nella classe genitore che non hanno alcun significato contestuale per quella classe e che non fanno nulla se chiamati da istanze di quella classe.

Se la classe figlio ha lo stesso comportamento della classe genitore ma la implementa in modo diverso, basta eseguire l'override dell'implementazione nella classe figlio. Il resto del sistema non si preoccuperà fintanto che il comportamento è come previsto. Ciò mantiene il polimorfismo e l'incapsulamento, l'utente dell'oggetto sa che eseguirà dei comportamenti ma non gli interessa come e non hanno bisogno di sapere se stanno effettivamente usando un'istanza della classe genitore o figlio. Ricorda che i metodi sono contratti con il resto del sistema, farò questo comportamento per te se me lo chiedi, ma non dirò come lo farò. Il nome del metodo dovrebbe indicare il comportamento che l'oggetto eseguirà per il resto del sistema. Se sia il genitore che il bambino eseguono lo stesso comportamento, dovrebbero pubblicizzarlo usando lo stesso metodo.

Assicurati che dal punto di vista dell'utente dell'oggetto il comportamento sia coerente. Non sovrascrivere mai un metodo che produce un comportamento diverso a seconda che sia chiamato l'oggetto genitore o figlio (cioè non fare mai in modo che un metodo "print_to_console" inizi improvvisamente a inviare email)

    
risposta data 10.12.2015 - 12:29
fonte
0

Nessuna delle due soluzioni è chiaramente superiore all'altra ed entrambe hanno i loro usi.

La prima soluzione funziona meglio se la classe Parent implementa un algoritmo che può essere esteso in uno o più punti (non necessariamente all'inizio o alla fine) e le estensioni dovrebbero essere inserite solo in quei punti di estensione definiti.

La seconda soluzione è tipica del caso in cui la classe Parent non prevede alcuna estensione all'algoritmo (in un linguaggio in cui i metodi sono virtuali per impostazione predefinita) o quando la classe Parent fornisce un'implementazione predefinita che alcuni bambini desiderano -use in aggiunta alle proprie modifiche a quell'impostazione predefinita.
Solitamente la soluzione 2 è preferibile se i bambini possono sostituire il metodo del genitore o aggiungere passaggi aggiuntivi in primo piano e / o dopo, ma non dovrebbero aggiungere passaggi nel mezzo dell'operazione eseguita dall'implementazione del genitore.

    
risposta data 10.12.2015 - 13:34
fonte