22
public sealed interface IMyInterface
{
}

给出“修改后的‘密封’对此项目无效”

我可以在某些方面理解接口必须是可继承的,否则类无法实现它。

但是为什么我不能指定一个接口不应该定义一个子接口,或者有没有办法,只是没有sealed

编辑

我应该努力解释为什么我想要这个。我经常看到开发人员应该使用组合的接口继承链。Sealed 非常适合在类中执行此操作,我想知道是否有办法对接口强制执行相同的操作。在我看来,由于不必要的继承使得重构和维护变得更加困难。

编辑 2

根据评论和帖子的反映,接口继承树不可能像对象继承树那样复杂。当您从另一个接口派生时,IX您所说的只是“必须实现IX”。阻止这种情况没有任何好处。

4

8 回答 8

25

封装一个类,或者一个类的虚方法,目的是为了降低你的成本。为继承而设计是昂贵的,如果你做的不对,那是很危险的。为继承设计不当会带来安全性、正确性和健壮性后果,因此如果您不打算为继承进行设计,明智的做法是密封您的类,从而避免与设计继承相关的成本。

类需要为继承而设计,因为它们具有实现细节。接口没有实现细节。接口可继承没有相关成本。因此没有动力添加允许接口被密封的特性。

于 2012-03-27T13:51:43.817 回答
14

这只会令人困惑。使用标准语法,这意味着您无法实现该接口。此外,接口不包含任何功能或字段,因此密封它没有实际用途。接口或多或少是一种契约。

从“接口继承”中密封一个接口不会做任何事情,因为人们可以只实现你的接口和另一个继承你的接口的接口。

于 2012-03-27T13:39:54.893 回答
5

sealed在接口的上下文中意味着没有类可以实现这个接口。那将是无用的,因此它是不允许的。

于 2012-03-27T13:39:21.320 回答
1

sealed关键字根本不是为接口设计的(也没有任何意义)。请参阅 msdn 文档http://msdn.microsoft.com/en-us/library/88c54tsw(v=vs.71).aspx

于 2012-03-27T13:39:26.487 回答
0

Sealed是类的关键字。接口的目标是让类实现它们定义的任何契约。可以封装实现接口的类,但是封装接口用处不大。

于 2012-03-27T13:40:10.113 回答
0

接口是您的应用程序合同......当您不需要合同时,为什么要定义它?

于 2012-03-27T13:54:12.377 回答
0

密封类的主要目的之一是要求该类的任何存储位置保存该精确类型的实例,而不是派生类型。尽管大多数代码不介意派生类型对象替换基类型对象时,但在许多情况下这种替换可能会出现问题。例如,一些类包含一个函数来执行与另一个相同类型的对象的相对比较,期望比较结果将产生一个可排序的序列。如果类型BarBoz都派生自Foo,并在比较中使用任何Bar-specific 或Boz-specific 字段,则可能无法合理地对包含BarBoz实例的序列进行排序。

接口不存在这样的目的,因为从本质上讲,接口被设计为由多个类实现。任何类都无法实现的接口将毫无用处,而只能由一个类实现的接口将毫无意义(如果IFoo不能是 a 以外的任何东西Foo,那么人们不妨简单地使用Foo每个地方倾向于使用IFoo)。

internal将接口的实现限制为定义它的模块和/或允许接口具有成员会有一些用处。我不知道为什么不允许这样做,甚至不知道允许或禁止此类事情是否比禁止它们“更容易”或更“难”。

于 2012-03-28T17:47:50.203 回答
-1

对我来说,interface意味着一个abstract关键字;因此,如果接口是sealed,那sealed abstract似乎是矛盾的。

于 2012-03-27T13:42:53.817 回答