Stavo passando per C# Brainteasers (http://www.yoda.arachsys.com/csharp/teasers.html) e ho trovato una domanda: quale dovrebbe essere l'output di questo codice?Comportamento diverso del metodo di overloading in C#
class Base
{
public virtual void Foo(int x)
{
Console.WriteLine ("Base.Foo(int)");
}
}
class Derived : Base
{
public override void Foo(int x)
{
Console.WriteLine ("Derived.Foo(int)");
}
public void Foo(object o)
{
Console.WriteLine ("Derived.Foo(object)");
}
}
class Test
{
static void Main()
{
Derived d = new Derived();
int i = 10;
d.Foo(i); // it prints ("Derived.Foo(object)"
}
}
Ma se cambio il codice per
class Derived
{
public void Foo(int x)
{
Console.WriteLine("Derived.Foo(int)");
}
public void Foo(object o)
{
Console.WriteLine("Derived.Foo(object)");
}
}
class Program
{
static void Main(string[] args)
{
Derived d = new Derived();
int i = 10;
d.Foo(i); // prints Derived.Foo(int)");
Console.ReadKey();
}
}
voglio perché l'uscita è sempre cambiato quando stiamo ereditando vs non ereditare; perché l'overloading dei metodi si comporta diversamente in questi due casi?
perdona la mia ignoranza, ma perché considera il metodo con parametro di tipo "oggetto" come il migliore, penso che int sia più vicino (come quello che sta accadendo in 2 ° caso) – Wondering
@Wondering: Sì, 'int' è meglio - ma il sovraccarico di 'int' sta già sovrascrivendo il metodo nella classe base, quindi non viene preso in considerazione: non conta come" appena dichiarato "nella classe derivata. Questo è il punto centrale di tutta questa spiegazione :) –
Grazie Jon per tutto il tempo e l'aiuto. Ho capito il punto. – Wondering