簡體   English   中英

C#過載問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM