Myślę, że przykład ArsenMkrt nie jest w pełni poprawny, a przynajmniej nie wyjaśnia w pełni ukrytej funkcji. Przez upuszczenie nowe słowo kluczowe z metodą Foo w klasie B, będzie wciąż wyjście
A::Foo()
B::Foo()
A::Foo()
w języku programowania takich jak Java, gdzie wszystkie metody są „wirtualne”, można się spodziewać, aby uzyskać wyjście
A::Foo()
B::Foo()
B::Foo()
poprzez kod ArsenMkrt jest powyżej, ze względu na konkretyzacji
A a;
B b;
a = new A();
b = new B();
a.Foo();
b.Foo();
a = new B(); //<< Here
a.Foo();
w swoim przykładzie jednak jeszcze dostać „a :: Foo()”, ponieważ w C# metody nie są wirtualne domyślnie s o metoda B :: Foo() automatycznie ukrywa A's Foo(). Aby osiągnąć polimorficzne trzeba napisać to w następujący sposób zamiast:.
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public override void Foo() { Console.WriteLine("B::Foo()"); }
}
Teraz jest gdzie „nowe” słowo kluczowe jest w rzeczywistości po opuszczeniu „override” z B :: Foo(), a następnie znowu ukryłoby A :: Foo(), co oznacza, że nie przesłonisz jego domyślnego zachowania i nie osiągniesz polimorfizmu, tzn. otrzymasz ponownie "A :: Foo()" jako wynik. To samo można osiągnąć - i tutaj nie rozumiem w 100%, dlaczego MUSISZ to ująć - umieszczając słowo kluczowe "nowy", takie jak ..
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public new void Foo() { Console.WriteLine("B::Foo()"); }
}
i ponownie uzyskać wyjście
A::Foo()
B::Foo()
A::Foo()
Co rozumiesz przez "ważny przykład"? Przykład, który jest po prostu poprawny pod względem składni, lub przykład pokazujący najlepsze praktyki ukrywania metody? –