2016-01-06 111 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;} 
} 
相关问题