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

问题描述 投票:0回答:8
public sealed interface IMyInterface
{
}

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

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

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

sealed

编辑

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

编辑2

根据评论和帖子的反映,接口继承树不可能像对象继承树那么复杂。当您从另一个接口派生时

IX
,您所说的只是“还必须实现
IX
”。阻止这种情况没有任何好处。

c# interface sealed
8个回答
30
投票

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

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


14
投票

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

将接口与“接口继承”隔离开来不会起到任何作用,因为人们可以只实现您的接口以及继承您接口的另一个接口。


5
投票

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


1
投票

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


0
投票

Sealed 是类的关键字。接口的目标是让类实现它们定义的任何契约。你可以密封实现接口的类,但是密封接口没有什么用处。


0
投票

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


0
投票

密封类的主要目的之一是要求该类的任何存储位置保存该精确类型的实例,而不是派生类型。 尽管大多数代码不介意何时用派生类型对象替换基类型对象,但在许多情况下这种替换可能会出现问题。 例如,某些类包含一个函数,用于与同一类型的另一个对象执行相对比较,并期望比较结果将产生可排序的序列。 如果类型

Bar
Boz
均派生自
Foo
,并在比较中使用任何
Bar
特定或
Boz
特定字段,则可能无法对包含
Bar
混合的序列进行明智的排序和
Boz
实例。

接口不存在这样的目的,因为从本质上讲,接口被设计为由多个类实现。 任何类都无法实现的接口是无用的,而只能由一个类实现的接口也是毫无意义的(如果

IFoo
不能是
Foo
以外的任何东西,那么也可以只需在人们愿意使用
Foo
的任何地方使用
IFoo
)即可。

将接口的实现限制在定义该接口的模块,和/或允许接口具有

internal
成员会很有用。 我不知道为什么不允许这样做,甚至不知道允许或禁止此类事情是否比禁止它们“更容易”或“更难”。


-1
投票

对我来说,

interface
意味着
abstract
关键字
;因此,如果一个界面是
sealed
,那么它就是
sealed abstract
,这似乎是一个矛盾。

© www.soinside.com 2019 - 2024. All rights reserved.