Utilizzo di Super.someMethod per maggiore chiarezza?

0

È Super.someMethod() una buona pratica per aggiungere chiarezza al codice affermando esplicitamente che someMethod non è un metodo incluso nella classe corrente ma nella classe genitore?

Ad esempio, avrebbe senso ...

private void someMethod() {
    super.someOtherMethod(); // this is in the parent class
    otherMethod(); // this can be found here
}

Invece di questo?

private void someMethod() {
    someOtherMethod(); 
    otherMethod(); 
}

Se questa non è una buona idea / pratica, c'è qualche convenzione su questo aspetto che aiuta a chiarire dove si trova il metodo?

Nota: tieni presente che non sto chiedendo di disambiguare le chiamate ai metodi sovrascritti! In quel caso particolare, per quanto ne so, usare Super è un must per invocare il metodo corretto.

    
posta carlossierra 15.06.2016 - 17:09
fonte

2 risposte

2

Considererei questo non solo una cattiva pratica, ma vanificando i principi di OOP perché una super chiamata è una forma di chiamata diversa: è una chiamata diretta che aggira il meccanismo di invio virtuale (è così che si evita la ricorsione infinita quando si è cercando di richiamare la gerarchia delle classi da un override).

Quando cambi i metodi, ad es. da someMethod a someOtherMethod , tipicamente in OOP, vuoi un nuovo invio virtuale completo per l'invocazione someOtherMethod , vale a dire che vuoi il primo il gestore è la vera classe dell'oggetto, non una classe base.

Considera che la vera classe dell'oggetto (per this ) è in realtà una sottoclasse, XYZ, che le linee di codice attuali nel tuo esempio non conoscono (e non dovrebbero avere). Quella sottoclasse può aver scelto di sovrascrivere someOtherMethod , e quando viene invocato (da un client esterno alla gerarchia di classi, e persino dall'implementazione di qualche altro metodo all'interno della gerarchia di classi), è qui che deve andare la chiamata.

Se non avessimo un invio virtuale completo per i metodi virtuali richiamati dalle implementazioni dei metodi della classe base, gran parte della potenza del metodo virtuale OOP e del meccanismo di override andrebbero persi.

In breve (a meno che tu non sappia veramente cosa stai facendo e stai provando a fare qualcosa di insolito), dovresti usare solo una super chiamata per richiamare la gerarchia di classi sullo stesso metodo e da una sovrascrittura di quella metodo. (Alcune lingue non ti permettono nemmeno di invocare super su un altro metodo o al di fuori di un override.)

    
risposta data 15.06.2016 - 18:18
fonte
0

Chiamare esplicitamente super.someMethod() può confondere un lettore che si aspetta di vederlo nel contesto della disambiguazione di una chiamata.

Dai Documenti Oracle su super :

[...] you can invoke the overridden method through the use of the keyword super.

Non sembra che dovrebbe essere usato tipicamente per chiarezza di dove il metodo vive.

    
risposta data 15.06.2016 - 17:34
fonte

Leggi altre domande sui tag