覆盖接口的返回类型

时间:2016-01-06 22:07:30

标签: c# class inheritance interface polymorphism

希望能够做到这一点!

我有一个基本界面

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

一个抽象类

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

现在,我将介绍一个"客户"继承自"实体"

interface Client : Entity
{

}

客户的子类为"配置"

interface IClientConfiguration : IConfiguration
{

}

最后,我希望我的Client类看起来像这样

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

问题是,C#抱怨我没有为类Client返回IConfiguration。我可以通过声明新的公共IClientConfiguration来覆盖它...但在我走这条路之前,我想知道是否有更好的方法来构建它并保持最佳实践。

感谢您的帮助! - 迈克尔

2 个答案:

答案 0 :(得分:0)

您可以在Client类中使用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值。混乱。

答案 1 :(得分:0)

我想您可能错过了将“IEntity”界面添加到“实体”类中。

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