.net-一个接口应该在

我似乎找不到答案,只想确保它是一个好的编码标准。我有许多不同类使用的接口A,并且不想更改接口A。我遇到了一个新的要求,该要求要求实现接口A的许多类都需要一个枚举,但是并不是所有的类都需要该枚举。我不希望不需要此新枚举的类来实现此新功能。因此,我创建了接口B,其中包含需要添加的新枚举。然后,我使接口B继承接口A,这是我关心的问题,一个接口可以继承另一个接口吗?为了继续进行更改,然后我将需要新枚举的类更改为实现接口B而不是接口A,因为它是由接口B继承的。我考虑过在需要它们的类中实现这两个接口,但是我正在使用接口整个代码,并且只想使用一个接口浏览类,而不要使用两个接口。

我希望这已经足够清楚(可能很长),但是如果有人可以给我一些建议,或者我做对了或者我做错了,请告诉我。

谢谢!

ajrawson asked 2019-10-09T06:59:58Z
6个解决方案
71 votes

接口继承是一个很好的工具,尽管您仅应在接口B真正可替代接口A时使用它,而不仅仅是汇总松散相关的行为。

很难确定它是否适合您的特定情况,但是原则上使用该实践没有错。 您始终可以在一流的API中看到它。 仅从.NET框架中选择一个常见示例:

public interface ICollection<T> : IEnumerable<T>, IEnumerable
Jeff Sternal answered 2019-10-09T07:00:16Z
17 votes

考虑一下接口是否应该在逻辑上配对,如果您觉得它们可以很好地相互配合,则绝对使用继承。

让我们看一个例子。

public interface IScanner
{
    void Scan();
}

public interface IPrinter
{
    void Print();
}

打印机和扫描仪通常是单独的对象,每个对象都有各自的功能,但是,这两个设备通常配对在同一设备上。

public interface IPhotocopier : IScanner, IPrinter
{
    void Copy();
}

IPhotocopier应该继承自IScanner和IPrinter是有道理的,因为它现在可以使复印机除了作为复印机的主要卷筒之外,还可以用作扫描仪或打印机(包含在其中)。

现在让我们再看一个界面;

public interface IBlender
{
    void Blend();
}

允许IBlender被任何较早的接口(您称它们为IBlendingScanner?)继承是没有意义的。

如果您不能为新接口赋予一个合理的名称,则可能表明您可能不想在这种情况下使用继承。

继承一些接口(例如IDisposable)是一个坏主意,因为这会迫使新接口的所有实现都实现处置模式,即使它们没有任何可使用的资源也是如此。

mark_h answered 2019-10-09T07:01:29Z
9 votes

从技术上讲,接口不会相互继承。 创建从IFoo继承的IFoo时,实际上是在说什么,任何实现DoBar()的类也必须实现IBar

interface IBar
{
    void DoBar();
}

interface IFoo : IBar
{
    void DoFoo();
}

在此的示例IFoo接口不具有DoBar()方法。 在大多数情况下,区别并不重要,但是在接口而不是类上使用反射时,它可能会咬人。

Joel Mueller answered 2019-10-09T07:02:01Z
6 votes

当然,可能有一个接口的继承树,甚至带有接口的“多重继承”。 正确与否取决于所讨论的接口。 如果确实是接口B是接口A的扩展或细化,则继承是有意义的,但是如果新枚举与接口A所表达的概念基本无关,则可以将它们设为两个单独的接口并具有类 需要同时实现两个接口。

qid answered 2019-10-09T07:02:27Z
2 votes

IMO这是正确的方法,我认为它没有任何问题。

J. Loomis answered 2019-10-09T07:02:52Z
1 votes

我认为数据库总是提供一种很好的方式来演示接口,因此考虑一个接口是否应该继承另一个接口,请看以下内容:

IMySqlDatabase : IDatabase
MySqlDatabase : IMySqlDatabase

IMsSqlDatabase : IDatabase
MsSqlDatabase : IMsSqlDatabase

MySqlDatabase是IMySqlDatabase,而IMySqlDatabase是IDatabase。

现在,如果您需要对IDatabase接口进行更改,那么孙辈(即数据库类)可以从中受益,但是您不必扩展MySQL和MsSQL(甚至可能扩展更多的DBMS接口)。 同时,在您的中间人(IMsSqlDatabase)中,您仍然可以具有MySQL或Oracle DB不支持的接口功能。

Despertar answered 2019-10-09T07:03:32Z
translate from https://stackoverflow.com:/questions/1688808/should-one-interface-inherit-another-interface