2011-04-27 83 views
2

是否有可能以某種方式實現以下方案:C#超載問題

public interface ISomething 
{ 
    void Go(ISpecific specific); 

    void Go(Object o); 
} 

讓每個Go(ISpecific)調用的第一個過載會被調用,與任何其他可能的通話對象的類將後備Go(Object)執行?

+1

它將工作。在編譯器中嘗試了一個簡單示例時,你發現了什麼? – taylonr 2011-04-27 14:13:42

回答

5

這就是默認情況下的工作方式 - 但使用編譯時間類型。如果您有Go(foo)且編譯時間類型foo未實現ISpecific,它將調用第二種方法,即使foo在執行時引用的對象實現了ISpecific。如果你想成爲在執行時間動態地做出了這個決定,如果你正在使用C#4,你可以寫:

dynamic value = GetValue(); 
something.Go(value); 

...並在執行時,正確的過載將被選中。

+0

你能舉一個這個表單的用處的例子嗎?有趣的是,我只是在今天早上閱讀了一篇有關方差和超載的博文。 – 2011-04-27 14:21:12

+0

@Justin:我不傾向於在動態類型方面做很多事情,所以我不確定...但聽起來這是OP *可能會在之後。 – 2011-04-27 14:24:19

5

是的。這就是編譯器的工作原理。

3

是的,有可能做到這一點。但請注意,根據參考的編譯時間類型決定要執行哪個重載。

ISpecific specificVar = null; 
something.Go(specificVar); // ISomething::Go(ISpecific) 
object obj = specificVar; 
something.Go(obj); // ISomething::Go(object) 
0

是的,它確實有效,任何非特定對象都會調用對象過載。

我寫了一個控制檯應用程序來檢查。

它輸出

Object 
Object 
Specific 

class Program 
{ 
    static void Main() 
    { 
     Object aSpecific = new Object(); 
     String nonSpecific = "nonSpecific"; 
     ISpecific specific = new Specific(); 

     ISomething something = new Something(); 

     something.Go(aSpecific); 
     something.Go(nonSpecific); 
     something.Go(specific); 

     Console.ReadKey(); 
    } 
} 

interface ISpecific 
{ 
    void GoGo(); 
} 

interface ISomething 
{ 
    void Go(ISpecific specific) 
    void Go(Object o) 
} 

Class Specific : ISpecific 
{ 
    public Specific() { } 

    public void GoGo() 
    { 
     Console.WriteLine("Specific"); 
    } 
} 

Class Something : ISomething 
{ 
    public Something() { } 

    public void Go(ISpecific specific) 
    { 
     specific.GoGo() 
    } 

    public void Go(Object o) 
    { 
     Console.WriteLine("Object"); 
    } 
}