【问题标题】:Interface inheritance limits接口继承限制
【发布时间】:2018-02-28 12:22:10
【问题描述】:

知道 C# 支持接口继承,我想创建一个接口“B”,它继承自基本接口“A”但也隐藏了一些接口“A”成员,就像一个类使用显式接口实现来隐藏一个接口成员,除非类实例被强制转换为实现的接口:

我的例子:

首先我用一些成员和方法创建一个接口IDbObject

public interface IDbObject
{
    IDbObject ParentObject
    {
        get;
    }
    .
    .
    .
}

然后我创建了第二个接口IDbConstraint,它继承了第一个接口,但由于继承是专业化的,我更了解ParentObject 成员,我想在子接口中调用ParentTable

public interface IDbConstraint : IDbObject
{
    // Hide IDbObject.ParentObject

    IDbTable ParentTable
    {
        get;
    }
    .
    .
    .
}

【问题讨论】:

  • 我不太确定你在问什么。为什么不直接实现派生接口 IDbConstraint 而不是 IDbObject?或者根据您实际尝试解决的问题,泛型可能是答案。
  • “继承”在谈论接口时总是错误的思维模式。您不会从界面继承蹲下,您得到的只是编写更多代码的需求。 IDbConstraint 有两个成员,没有什么被“遮蔽”。在实现它时它会让你头疼,因为它们的名字是模棱两可的,需要明确的实现来处理它。如果你有选择,你可以选择,然后给他们不同的名字。
  • 从头开始声明一个接口 IDbConstraint 具有一半的属性和已经在另一个接口 IDbObject 中声明的方法只是浪费时间和存储空间。 Inheretence 可以解决这类问题,为什么不使用呢?

标签: c# oop interface


【解决方案1】:

我不知道细节,因此我可能会说错话。 但我认为这可能是使用抽象类而不是接口的解决方案。

public interface IDbObject
{
    IDbObject ParentObject
    {
        get;
    }
}
public abstract class IDbConstraint : IDbObject
{
    public IDbObject ParentTable 
    {
        get;
    }

    //Hidden becouse not public
    IDbObject IDbObject.ParentObject => throw new NotImplementedException();
}

【讨论】:

  • 使用抽象类而不是接口是一个重大的架构变化,在我看来,它被认为是一种解决方法而不是解决方案。
【解决方案2】:

我知道的最好的解决方案是等到实现时间,然后使用显式接口实现来隐藏 ParentObject 成员,除非实例被强制转换为 IDObject:

public class DbConstraint : IDbDbConstraint
{
    IDbObject IDbObject.ParentObject
    {
        get;
    }

    IDbTable ParentTable
    {
        get;
    }
    .
    .
    .
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2011-01-05
    • 1970-01-01
    • 2010-09-21
    • 2015-10-12
    相关资源
    最近更新 更多