簡體   English   中英

為什么不調用重載方法?

[英]Why isn't the overloaded method getting called?

我認為被調用的方法是運行時決定的,還是我錯過了什么? 示例代碼:

class Program
{
    static void Main(string[] args)
    {
        var magic = new MagicClass();
        magic.DoStuff(new ImplA());
        magic.DoStuff(new ImplB());
        Console.ReadLine();
    }
}
class MagicClass
{
    internal void DoStuff<T>(T input) where T : SomeBase
    {
        HiThere(input);
    }

    void HiThere(SomeBase input)
    {
        Console.WriteLine("Base impl");
    }

    void HiThere(ImplA input)
    {
        Console.WriteLine("ImplA");
    }

    void HiThere(ImplB input)
    {
        Console.WriteLine("ImplB");
    }
}

abstract class SomeBase
{

}
class ImplA : SomeBase{}
class ImplB : SomeBase{}

我以為我會得到:

ImplA
ImplB

作為輸出但它打印Base impl 有什么我可以做的,以獲得重載方法而不輸入輸入?

編譯器選擇過載。 對於這里的電話:

internal void DoStuff<T>(T input) where T : SomeBase
{
    HiThere(input);
}

它選擇SomeBase ,因為這就是編譯時的全部內容。

你最想要的是覆蓋。 這意味着必須將不同的邏輯放入SomeBase的繼承者中:

abstract class SomeBase
{
  abstract string Name { get; }
}
class ImplA : SomeBase{ override string Name { get { return "ImplA"; } } }
class ImplB : SomeBase{ override string Name { get { return "ImplB"; } } }

void HiThere(SomeBase input)
{
    Console.WriteLine(input.Name);
}

在編譯期間選擇過載。
在運行時期間選擇覆蓋。

在這里,編譯器只知道T可以分配給SomeBase ,但沒有別的。 實際上,如果它按預期工作,你將能夠完全跳過where T : SomeBase部分。 您需要它的原因是編譯器需要知道該信息,以便檢查可以在提供的對象上調用的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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