2013-05-01 8 views
12

Mi chiedo quale sia il motivo dell'invocazione del metodo che stampa "double in derivato". Non ho trovato alcun indizio per questo nella specifica C#.C# Richiamo del metodo di overload con Ereditarietà

public class A 
{ 
    public virtual void Print(int x) 
    { 
     Console.WriteLine("int in base"); 
    } 
} 

public class B : A 
{ 
    public override void Print(int x) 
    { 
     Console.WriteLine("int in derived"); 
    } 
    public void Print(double x) 
    { 
     Console.WriteLine("double in derived"); 
    } 
} 



B bb = new B(); 
bb.Print(2); 
+0

http://msdn.microsoft.com/en-us/library/aa691338%28v=vs.71%29.aspx – spender

+0

Se riesci a decifrare le regole 7.4.2.2 e 7.4.2.3, probabilmente sei più intelligente di me, ma sarà lì da qualche parte. – spender

+0

@spender, Potrebbe essere lì, ma è scritto male :). – Silvermind

risposta

6

Direttamente dal C# spec (7.5.3 Risoluzione Overload):

l'insieme dei candidati per una chiamata di metodo non lo fa includi i metodi contrassegnati con override (§7.4) e i metodi in una classe base non sono candidati se è applicabile qualsiasi metodo in una classe derivata (§7.6.5.1).

Nel tuo esempio, il sovrascrittoPrint(int x) non è un candidato e Print(double x) è applicabile, in modo viene raccolto, senza la necessità di prendere in considerazione i metodi nella classe base.

0

Il compilatore guarda metodi che sono appena dichiarati nella classe più derivata (in base al tipo in fase di compilazione della espressione) e vede se ce ne sono applicabili. Se lo sono, utilizza il "migliore" disponibile.

vedere la risposta a questa domanda:

Different behaviour of method overloading in C#

+2

Si prega di citare e includere un collegamento alla risposta originale. Grazie. –

+0

Aggiunto un collegamento alla risposta sopra, in cui la citazione è stata presa da – cvraman

Problemi correlati