sovrascrivere i metodi della classe base implementati

0

Ho letto da qualche parte che la catena dell'ereditarietà si interrompe quando modifichi un comportamento dalla classe derivata. Cosa significa "alterare un comportamento" significa qui? Ignora un metodo già implementato nella classe base considerato come "comportamento alterante"? Oppure, l'autore significa alterare le firme dei metodi e l'output?

Inoltre, sono pronto. Duplicare il codice non è una buona pratica, ed è un incubo di manutenzione. Ancora una volta, sovrascrive un metodo già implementato nella classe base considerato "Duplicating code"? In caso contrario, quale sarebbe considerato come "codice di duplicazione"? Io

    
posta user793468 13.05.2014 - 04:03
fonte

1 risposta

1

I read somewhere that the chain of inheritance breaks when you alter a behavior from derived class. What does "altering a behavior" mean here?

Usando C # come esempio, potresti avere una classe base come:

public class SomeBaseClass
{
    public virtual void DoSomething()
    {
        Console.WriteLine("Hello world!");
    }
}

E poi una classe figlia come questa:

public class MyChildClass : SomeBaseClass
{
    public override void DoSomething()
    {
        Console.WriteLine("This method now does something completely different!");
    }
}

Tuttavia, se hai aggiunto base.DoSomething(); al metodo MyChildClass , chiamerebbe entrambi il metodo genitore (in uscita "Hello world!") e il nuovo metodo (in uscita "Questo metodo. .. "). L'ordine in cui vengono visualizzati dipende da dove hai inserito la chiamata al metodo base.DoSomething(); .

Evitando di chiamare il metodo base, credo che si interromperebbe la catena dell'ereditarietà, poiché non esegue più il metodo previsto della classe genitore.

Un'altra opzione è utilizzare la sintassi new sul metodo in questo modo:

new public void DoSomething()
{
}

Si chiama metodo nascosto e ti consente nuovamente di definire un comportamento completamente nuovo, ma espone un metodo diverso al mondo esterno, rispetto a quello visibile da SomeBaseClass . Non ho avuto bisogno di usarlo da solo, ma capisco che possa essere utile in alcune situazioni.

Naturalmente, la tua milage può variare per queste sintassi e comandi a seconda della lingua scelta, ma l'idea generale è la stessa.

I read that Duplicating code is not a good practice, and its a maintenance nightmare. Again, does overriding an already implemented method in base class considered "Duplicating code"?

Duplicare il codice è una cattiva pratica, in quanto può causare errori durante la manutenzione. Supponiamo che tu abbia una funzione che calcola un valore usando aritmetica complessa o simili. Invece di creare correttamente un metodo, basta copiarlo e incollarlo una dozzina di volte secondo necessità. Ora, quando qualcosa cambia (e lo farà! Oh, le cose cambieranno) devi individuarlo una dozzina di volte e inserire il codice corretto in una dozzina di volte. Inserendolo in un metodo lo si cambia solo una volta e viene corretto anche tutto ciò che utilizza quel codice.

Astrazione ed ereditarietà riduce la duplicazione del codice, perché puoi creare una classe base o un metodo come modello e devi solo scriverlo una volta. Il design intelligente degli oggetti consente di creare codice altamente riutilizzabile che è stato testato e privo di errori. Inoltre, le seguenti linee guida di ereditarietà permetteranno classi child che possono usare il codice partendo dal presupposto che "funziona" e possono sovrascrivere l'implementazione, fornendo un comportamento nuovo o più specifico per se stesso, se necessario.

    
risposta data 13.05.2014 - 04:42
fonte

Leggi altre domande sui tag