2014-05-24 50 views
1

就在前幾天,我發現一個實際上花了我一段時間才發現的錯誤。 不知何故,當通過繼承接口執行時,似乎發生了錯誤的重載。看看這個代碼。輸入推理接口

class Program 
{ 
    static void Main(string[] args) 
    { 
     IBar bar = new Bar();     
     bar.Execute("TEST"); 
    } 
} 


public interface IFoo 
{ 
    void Execute(string value); 
} 

public interface IBar : IFoo 
{ 
    void Execute(object value); 
} 

public class Foo : IFoo 
{ 
    public void Execute(string value) 
    { 
     Console.WriteLine("Foo.Execute - string"); 
    } 
} 

public class Bar : IBar 
{ 
    public void Execute(string value) 
    { 
     Console.WriteLine("Bar.Execute - string"); 
    } 

    public void Execute(object value) 
    { 
     Console.WriteLine("Bar.Execute - object"); 
    } 
} 

從這個程序的輸出是「酒吧 - 執行 - 對象」對我來說似乎有些奇怪,因爲更具體的過載可通過繼承IFoo的接口。誰能解釋這種行爲?

問候

伯恩哈德·裏希特

回答

3

我想在這個博客,你可以找到解釋:當編譯器去尋找實例方法重載http://csharpindepth.com/Articles/General/Overloading.aspx

,它 認爲編譯時呼叫的「目標」類,並且 查看在那裏聲明的方法。如果它找不到合適的東西, 它會查看父類......然後是祖父類,等等。 這意味着如果在層次結構的不同級別有兩種方法,那麼「更深」的方法將會應該先選擇,即使它不是 「更好的功能成員」。