是否有可能以某種方式實現以下方案:C#超載問題
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
讓每個Go(ISpecific)
調用的第一個過載會被調用,與任何其他可能的通話對象的類將後備到Go(Object)
執行?
是否有可能以某種方式實現以下方案:C#超載問題
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
讓每個Go(ISpecific)
調用的第一個過載會被調用,與任何其他可能的通話對象的類將後備到Go(Object)
執行?
這就是默認情況下的工作方式 - 但使用編譯時間類型。如果您有Go(foo)
且編譯時間類型foo
未實現ISpecific
,它將調用第二種方法,即使foo
在執行時引用的對象實現了ISpecific
。如果你想成爲在執行時間動態地做出了這個決定,如果你正在使用C#4,你可以寫:
dynamic value = GetValue();
something.Go(value);
...並在執行時,正確的過載將被選中。
你能舉一個這個表單的用處的例子嗎?有趣的是,我只是在今天早上閱讀了一篇有關方差和超載的博文。 – 2011-04-27 14:21:12
@Justin:我不傾向於在動態類型方面做很多事情,所以我不確定...但聽起來這是OP *可能會在之後。 – 2011-04-27 14:24:19
是的。這就是編譯器的工作原理。
是的,有可能做到這一點。但請注意,根據參考的編譯時間類型決定要執行哪個重載。
ISpecific specificVar = null;
something.Go(specificVar); // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj); // ISomething::Go(object)
是的,它確實有效,任何非特定對象都會調用對象過載。
我寫了一個控制檯應用程序來檢查。
它輸出
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");
}
}
它將工作。在編譯器中嘗試了一個簡單示例時,你發現了什麼? – taylonr 2011-04-27 14:13:42