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.