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

时间:2012-03-27 13:36:50

标签: c# interface sealed

public sealed interface IMyInterface
{
}

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

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

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

修改

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

修改2

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

8 个答案:

答案 0 :(得分:18)

密封课程或课堂的虚拟方法的目的是降低成本。设计继承是昂贵的,如果你没有正确地做,那就是危险。不正确地设计继承会产生安全性,正确性和健壮性,因此如果您不打算设计继承,那么密封您的类是明智的,从而避免与继承设计相关的成本。

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:4)

接口上下文中的

sealed意味着没有类可以实现此接口。那将毫无用处,因此不允许这样做。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

Sealed是类的关键字。接口的目标是让类实现他们定义的任何合同。您可以密封实现接口的类,但密封接口几乎没用。

答案 5 :(得分:0)

接口是您的申请合同......当您不需要合同时,为什么要定义它?

答案 6 :(得分:0)

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

接口不存在这样的目的,因为它们的本质接口被设计为由多个类实现。任何类都无法实现的接口将是无用的,并且只能由一个类实现的接口将是毫无意义的(如果IFoo不能是Foo之外的其他任何东西。 1}},也可以简单地使用Foo每个人倾向于使用IFoo)。

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

答案 7 :(得分:-1)

对我而言,interface意味着abstract keyword;所以如果一个界面是sealed,那么sealed abstract似乎是一个矛盾。