[英]C# overload question
是否有可能以某種方式實現以下方案:
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
這樣在每個Go(ISpecific)
調用中都會調用第一個重載,並且對於任何其他可能的對象的調用 class 會回退到Go(Object)
實現?
是的。 這就是編譯器的工作方式。
這就是默認情況下的工作方式 - 但使用編譯時類型。 如果你有Go(foo)
並且foo
的編譯時類型沒有實現ISpecific
,即使foo
在執行時引用的 object 實現了ISpecific
,它也會調用第二種方法。 如果您希望在執行時動態做出此決定,並且您使用的是 C# 4,您可以編寫:
dynamic value = GetValue();
something.Go(value);
...在執行時,將選擇正確的重載。
是的,可以這樣做。 請注意,將根據引用的編譯時類型來決定采用哪個重載。
ISpecific specificVar = null;
something.Go(specificVar); // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj); // ISomething::Go(object)
是的,它確實有效,任何不是 ISpecific 的 object 都會調用 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");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.