2016-01-06 112 views
2

希望這可以做到!覆蓋界面的返回類型

我有一個基本接口

interface IEntity 
{ 
    IConfiguration Configuration {get; set;} 
} 

而且一個抽象類

abstract class Entity 
{ 
    abstract IConfiguration Configuration {get; set;} 
} 

現在我就爲大家介紹,從 「實體」

interface Client : Entity 
{ 

} 

客戶端繼承了一個 「客戶」有一個子類「配置」

interface IClientConfiguration : IConfiguration 
{ 

} 

所以最後,我想我的客戶端類,看起來像這樣

class Client : IClient 
{ 
    public IClientConfiguration Configuration {get; set;} 
} 

問題是,C#抱怨說我不回來了類客戶端的IConfiguration。我可以通過聲明新的公共IClientConfiguration來覆蓋這個...但在我走這條路線之前,我想知道是否有更好的方法來構造這個並保持最佳實踐。

感謝您的幫助! --Michael

+1

爲什麼不只是返回'IConfiguration'?通常的界面設計意味着調用代碼不知道什麼是實現接口... – BradleyDotNET

+0

你可以使'IEntity'模板,而不是返回'TConfigurationType配置{獲取;組; }'並把一個約束'在哪裏TConfigurationType:IConfiguration' – Rob

回答

0

你可以使用explicit interface implementation在你的客戶端類:

class Client : IClient 
{ 
    public IClientConfiguration Configuration { get; set; } 

    // Explicit implementation 
    IConfiguration IEntity.Configuration 
    { 
     get { return this.Configuration; } 
     set { /* what to do here? */ } 
    } 
} 

這是常見的做法實施IEnumerable<T>時,因爲該接口擴展IEnumerable。這兩個接口均聲明稱爲GetEnumerator的方法,但返回類型不同(IEnumerator<T> vs IEnumerator)。

但是,我認爲你已經在某個地方犯了設計錯誤。配置屬性是get/set。這給人的印象是你的客戶端類必須能夠接受任何類型的配置。同時,您的客戶類似乎只能使用IClientConfiguration值。混亂。

0

我想你可能錯過了爲你的「實體」類添加「IEntity」接口。

abstract class Entity : IEntity 
{ 
    abstract IConfiguration Configuration {get; set;} 
} 
相關問題