2012-12-25 65 views
5
interface IAlpha 
{ 
    IBeta BetaProperty { get; set; } 
} 

interface IBeta 
{ 

} 

class Alpha : IAlpha 
{ 
    public Beta BetaProperty { get; set; } // error here 
} 

class Beta : IBeta 
{ 

} 

'InterfaceTest.Alpha' 不實現接口成員 'InterfaceTest.IAlpha.BetaProperty'。 'InterfaceTest.Alpha.BetaProperty'不能實現'InterfaceTest.IAlpha.BetaProperty',因爲它沒有匹配的返回類型'InterfaceTest.IBeta'。C#接口屬性實現

我的問題是,爲什麼是限制在非常相同類型的屬性實現。爲什麼我不能使用派生類型?

+2

繼承接口的類確實會返回一個在接口中聲明的IBeta的Beta。 –

回答

10

你必須實現確切的相同的接口。例如,這應該是有效的:

IAlpha alpha = new Alpha(); 
alpha.BetaProperty = new SomeOtherIBetaImplementation(); 

...但不會與你的代碼總是希望它是一個Beta工作,不是嗎?

您可以使用泛型這個雖然:

interface IAlpha<TBeta> where TBeta : IBeta 
{ 
    TBeta BetaProperty { get; set; } 
} 

... 

public class Alpha : IAlpha<Beta> 

當然,這可能是矯枉過正 - 你可能會更好只使用AlphaIBeta類型的屬性,正如每個接口。這取決於上下文。

+0

非常感謝解釋和替代解決方案。 :) – karaxuna

+0

@Jon Keet。爲什麼如果IAlpha接口僅在BetaProperty上定義了一個getter,它仍然不可能?任何接口實現將始終保證返回一個IBeta。 – user2697817

+0

@ user2697817:這只是定義.NET和C#的方式。你可以使用顯式的接口實現來實現'IAlpha',然後公開一個具有相同名稱的更具體的屬性getter。 –

2

一個接口聲明瞭一個類的方法集合,所以任何使用該接口的人都知道該期待什麼。因此,如果你正在實現這個接口,你必須實現接口,所有其他用戶得到他們所期望的。