Załóżmy, że jeśli mam interfejs jak określono poniżej:C# Interfejs Dziedziczenie do klasy abstrakcyjnej
public interface IFunctionality
{
void Method();
}
i implementować ten interfejs dla klasy abstrakcyjnej, jak pokazano poniżej:
public abstract class AbstractFunctionality: IFunctionality
{
public void Method()
{
Console.WriteLine("Abstract stuff" + "\n");
}
}
znowu mam klasa betonu, która dziedziczy z klasy abstrakcyjnej, jak poniżej:
public class ConcreteFunctionality: AbstractFunctionality
{
public void Method()
{
Console.WriteLine("Concrete stuff" + "\n");
}
}
Teraz mam następującą ofertę de,
ConcreteFunctionality mostDerived = new ConcreteFunctionality();
AbstractFunctionality baseInst = mostDerived;
IFunctionality interfaceInst = mostDerived;
mostDerived.Method();
baseInst.Method();
interfaceInst.Method();
Dane wyjściowe, które otrzymuję po wykonaniu tych czynności są następujące.
Concrete stuff
Abstract stuff
Abstract stuff
Ale to, co zostało oczekując wyjście będzie „konkretne rzeczy” we wszystkich trzech przypadkach, co robię tutaj jest przypisanie odniesienie ConcreteFunctionality
do zmiennych typu AbstractFunctionality
i IFunctionality
.
Co dzieje się wewnętrznie. Uprzejmie wyjaśnij.
To może wyjaśnić coś więcej: http://stackoverflow.com/questions/392721/difference-between- shadowing-and-overriding-in-c- – Stormenet
"Jest ukryty, nie przesłonięty" - dobra mantra do zapamiętania. (Ale twój kompilator powinien o tym wspomnieć, czy masz odfiltrowane ostrzeżenia?) – kmote