2014-04-18 11 views
6

Okay, ho una classe derivata che ha un sovraccarico in un metodo presente nella mia classe base. Chiamo ciò che penso possa corrispondere alla firma del metodo della classe base, ma invece viene chiamata l'implementazione delle classi derivate. (Il codice sottostante stampa sempre "MyDerived") Perché è questo?Compilatore che preleva il sovraccarico errato

public class MyBase 
    { 
     public void DoSomething(int a) 
     { 
      Console.WriteLine("MyBase"); 
     } 
    } 

    public class MyDerived : MyBase 
    { 
     public void DoSomething(long a) 
     { 
      Console.WriteLine("MyDerived"); 
     } 
    } 


Main() 
{ 
    MyDerived d = new MyDerived(); 
    d.DoSomething((int)5); 
} 
+1

Io ho semplicemente copiato il codice in una nuova console app, e vengo "MyDerived" scritto fuori ogni volta. È questo il codice esatto che stai usando? –

+0

Siamo spiacenti! Intendevo che stampasse MyDerived! Typo lo sto cambiando ora! –

risposta

5

maggior parte delle persone assumono il DoSomething (int) di sovraccarico sulla classe di base è una partita migliore rispetto al (lungo) di sovraccarico DoSomething.

Tuttavia, poiché la variabile è un tipo derivato, verrà chiamata la versione di DoSomething. Il runtime .NET favorisce sempre il tipo di derivazione più derivato.

Se trova una firma del metodo che funzionerà sul tipo derivato, verrà utilizzata prima di passare a uno qualsiasi dei metodi della classe base. In generale, si dovrebbe evitare di sovraccaricare i metodi definiti nelle classi di base.

+0

Quindi se l'OP ha fatto 'MyBase d = new MyDerived();', allora vedrebbe "MyBase" scritto. –

+0

@GrantWinney, Sì, è corretto. –

Problemi correlati