界面问题

时间:2009-04-08 12:39:14

标签: c# interface

我有一个名为Foo的对象。现在它实现了IFoo,它有很多属性。

我有一个类只依赖于其中的一些属性所以我创建了IMeasurableFoo(它只有一些属性)

为避免重复代码,我现在有了IFoo:IMeasurableFoo,因为我将属性移动到IMeasurableFoo

但是从继承的角度来看这是错误的,因为你有一个从特定接口继承的更通用的接口

关于组织这些抽象的最佳方式的任何想法

例如,如果这些是具体结果:

Bird不会继承FlyingBird(反过来也是如此)

7 个答案:

答案 0 :(得分:5)

不,它不是“从特定接口继承的更通用的接口”。只有几个属性的IMeasurableFoo 泛型接口,而IFoo更具体,因为它改进了有关IMeasurableFoo的知识。认为IList继承自IEnumerable

答案 1 :(得分:4)

也许更改名字? IMeasurableFoo听起来确实是一个更具体的界面,但你不能只称它为IFoo并重命名原始的IFoo界面吗?或者重命名两个?

IMeasurableFoo真的是一个IFoo或(可能)是一个无法忍受的吗?

答案 2 :(得分:1)

不要将接口继承用于避免重复代码的唯一目的。如果两个接口之间没有关系,则它们不需要实现继承。

如果Foo不是MeasurableFoo,则没有继承需求。

答案 3 :(得分:1)

不,我不认为它有什么问题。可能只是IMeasurableFoo的名称具有误导性,因为它只是可衡量的而且不是完整的Foo

答案 4 :(得分:0)

我不认为IMeasurableFoo不那么通用。由于IFoo包含IMeasurableFoo,我认为IMeasurebleFoo更通用。

感觉就像你有IBaseInterface和IExtendedInterface:IBaseInterface。

换句话说,我认为你有正确的方法。

编辑:使用您的示例IBird和IFlyingBird,您只是有一个命名问题。它应该是:

public interface IFlyer
{
    void Fly();
}

public interface IBird : IFlyer
{
    void Chirp();
}

答案 5 :(得分:0)

在这种情况下,我认为事物的命名是问题而不是事物本身。换句话说,具有较少成员的接口往往比具有更多成员的接口更抽象。

答案 6 :(得分:0)

这里有什么奇怪的?接口继承增加了每个继承级别的方法和属性的数量。

将IMeasurableFoo重命名为IBar,更具特异性/更通用性的感觉将消失