为什么接口无法标记为密封

本文关键字:记为 密封 接口 为什么 | 更新日期: 2023-09-27 18:29:04

public sealed interface IMyInterface
{
}

给出"修改后的'密封'对此项目无效">

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

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

编辑

我应该努力解释为什么我想要这个。我经常看到接口继承链,其中开发人员应该使用组合。密封在类中是理想的选择,我想知道是否有办法对接口强制执行相同的方法。因为在我看来,非继承使得重构和维护变得更加困难。

编辑 2

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

为什么接口无法标记为密封

密封类或类的虚拟方法的目的是降低成本。为继承而设计是昂贵的,如果你做得不正确,这是危险的。不正确地设计继承会产生安全性、正确性和健壮性后果,因此,如果您不打算为继承进行设计,明智的做法是密封您的类,从而避免与继承设计相关的成本。

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

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

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

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

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

密封是类的关键字。接口的目标是让类实现它们定义的任何协定。您可以密封实现接口的类,但密封接口几乎没有用处。

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

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

接口不存在这样的目的,因为就其性质而言,接口被设计为由多个类实现。 一个不能由任何类实现的接口将是无用的,一个只能由一个类实现的接口将是没有意义的(如果IFoo不能是除了Foo之外的任何东西,那么人们不妨简单地使用Foo人们倾向于使用IFoo(。

将接口

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

对我来说

interface意味着一个abstract关键字;所以如果一个接口是sealed的,那将sealed abstract似乎是一个矛盾。