Penso che l'esempio di ArsenMkrt non sia completamente corretto, almeno non spiega completamente la funzione di occultamento. Facendo cadere la nuova parola chiave dal metodo Foo in classe B, si continua a ottenere l'output
A::Foo()
B::Foo()
A::Foo()
In un linguaggio di programmazione come Java, dove tutti i metodi sono "virtuali", che ci si aspetta di ottenere l'output
A::Foo()
B::Foo()
B::Foo()
prendendo il codice di ArsenMkrt sopra, a causa l'istanza
A a;
B b;
a = new A();
b = new B();
a.Foo();
b.Foo();
a = new B(); //<< Here
a.Foo();
nel suo esempio tuttavia, è ancora ottenere "a :: Foo()", perché in C# metodi non sono virtuali di default e S o il metodo B :: Foo() nasconde automaticamente A's Foo(). Per ottenere il comportamento polimorfico si deve scrivere come segue invece:.
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public override void Foo() { Console.WriteLine("B::Foo()"); }
}
Ora è dove la "nuova" parola chiave viene in realtà quando si lascia il "override" da B :: Foo(), allora si di nuovo nasconderebbe A :: Foo() che significa che non si ignora il comportamento predefinito e non si ottiene il polimorfismo, cioè si ottiene "A :: Foo()" di nuovo come output. Lo stesso può essere raggiunto - ed ecco dove non riesco a capire al 100% perché lo si debba mettere - inserendo la parola chiave "nuova" come ..
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public new void Foo() { Console.WriteLine("B::Foo()"); }
}
e ancora ottenere l'uscita
A::Foo()
B::Foo()
A::Foo()
Cosa intendi con "esempio valido"? Un esempio che è semplicemente sintatticamente corretto o un esempio che mostra le migliori pratiche per nascondere il metodo? –