一个接口应该inheritance另一个接口

我似乎无法find答案,只是想确保这是一个好的编码标准。 我有接口A被许多不同的类使用,不希望接口A改变。 我遇到了一个新的需求,需要实现接口A的许多类需要枚举,但并不是所有的类都需要这个枚举。 我不希望那些不需要这个新枚举的类来实现这个新的function。 所以我创build了接口B,其中包含我需要添加的新枚举。 然后我做了接口Binheritance接口A,这是我的关注,一个接口inheritance另一个接口可以吗? 为了继续我的更改,我将需要新枚举的类更改为实现接口B而不是接口A,因为它是由接口Binheritance的。我想在我的类中实现两个接口,但需要它们,但是我使用在整个代码的接口,并希望只使用一个接口来查看类而不是两个。

我希望这已经足够清楚了(可能会很长),但如果任何人都可以给我一些build议,无论我做对了还是我做错了,请让我知道。

谢谢!

接口inheritance是一个很好的工具,但是只有在接口B可以真正代接口A的时候才使用接口inheritance,而不仅仅是聚合松散相关的行为。

原因很难说是否适合您的具体情况,但原则上没有错。 你一直在一stream的API中看到它。 从.NET框架中select一个常见的例子:

public interface ICollection<T> : IEnumerable<T>, IEnumerable 

考虑接口是否应该在逻辑上配对,如果你觉得它们互相配合,那么绝对使用inheritance。

让我们看一个例子。

 public interface IScanner { void Scan(); } public interface IPrinter { void Print(); } 

打印机和扫描仪通常是独立的对象,每个都有自己的function,但是这两个设备通常在同一个设备中配对。

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

IPhotocopier应该从IScanner和IPrinterinheritance,因为这样现在可以将复印机作为扫描仪或打印机(它包含的),除了作为复印机的主卷之外。

现在让我们看看更多的界面;

 public interface IBlender { void Blend(); } 

允许IBlender被任何早期的接口inheritance(你会怎么称呼它们?IBlendingScanner?)是没有意义的。

如果你不能给你的新界面一个明智的名字,这可能表明你可能不希望在这种情况下使用inheritance。

inheritance一些接口(如IDisposable)是一个糟糕的主意,因为这会迫使新接口的所有实现都实现处理模式,即使它们没有任何可用的资源。

当然可以有一个接口的inheritance树,甚至有接口的“多重inheritance”。 无论是否正确,取决于所讨论的接口。 如果接口B是接口A的扩展或细化,那么inheritance是有意义的,但如果新的枚举与接口A所expression的概念很大程度上无关,那么我将使它们成为两个单独的接口,需要实现这两个接口。

从技术上说,接口不会彼此inheritance。 当你创build一个从IBarinheritance的IFoo ,真正发生的事情是,你说任何实现IFoo类都必须实现IBar

 interface IBar { void DoBar(); } interface IFoo : IBar { void DoFoo(); } 

在这个例子中, IFoo接口没有DoBar()方法。 大多数情况下,区别并不重要,但是在界面上而不是类中使用reflection时,可能会咬你。

海事组织这是正确的做法,我没有看到任何问题。

我认为数据库总是提供一个很好的方式来演示接口,所以考虑一个接口是否应该inheritance另一个接口来看看下面的内容,

 IMySqlDatabase : IDatabase MySqlDatabase : IMySqlDatabase IMsSqlDatabase : IDatabase MsSqlDatabase : IMsSqlDatabase 

MySqlDatabase是IMySqlDatabase,IMySqlDatabase是IDatabase。

现在,如果需要对IDatabase接口进行更改,它的孙子(conrete数据库类)可以获得好处,但是不必扩展MySQL和MsSQL(或者甚至更多的DBMS接口)。 同时在你的中间人(IMsSqlDatabase)中,你仍然可以拥有MySQL或Oracle DB不支持的界面function。