【问题标题】:Is there a way to limit who can inherit a class or interface?有没有办法限制谁可以继承类或接口?
【发布时间】:2011-12-25 21:28:22
【问题描述】:

我想知道是否有办法限制谁可以从类继承。

  • internal: 不允许类在程序集外继承
  • sealed: 类不能被继承

是否有关键字或方法只允许某些类(假设仅从它自己的命名空间)继承该类?

另外,我不希望这个特殊的类是通用的。 我关心的不是安全性,而是总体设计。

我想要的示例:

  • A 类。
  • B 类继承自 A
  • C 类不能从 A 继承

【问题讨论】:

  • 将类设为内部不仅可以防止外部类继承,还可以防止使用它。为了防止外部子类,您需要特殊技巧,例如 internal abstract 方法,而这在接口上不起作用。
  • 你想要什么样的限制?你看过InheritanceDemand吗? palisade.plynt.com/issues/2006Apr/link-demand
  • 请注意,限制到命名空间并不能提供太多保护,因为流氓程序集可以只说namespace Awesome { public class Stolen : Secret {} },现在他们可以使用Awesome.Stolen 访问Awesome.Secret
  • @odyodyodys:那么你可能应该一开始就这么说。这很容易做到。使所有构造函数内部化。那么只有同一个程序集中的类可以继承,因为继承需要一个可访问的ctor。
  • 好的,现在我只是不明白这个问题。您有两个类在同一个程序集中,并且您希望其中一个类不从另一个类继承。好的,那你需要我们做什么?这是你的代码;随心所欲地写!你不需要一个特殊的关键字来阻止你做一些你知道你不应该做的事情。

标签: c# .net-3.5


【解决方案1】:

有没有办法只允许某些类继承该类?

是的。如果继承代码部分信任,那么你可以在基类上放置继承要求,如果继承类不满足条件,运行时将不允许加载需求:

https://msdn.microsoft.com/en-us/library/x4yx82e6(v=vs.100).aspx

当然,完全信任意味着完全信任。完全受信任的代码可以继承它想要的任何东西。

我怀疑您正在尝试施加您确实不应该尝试施加的限制。你能描述一下你为什么要尝试做这件困难的事情吗?可能有更好的方法来做你想做的事。

更新:

我试图在同一个程序集中的类中限制继承。

那么你可能一开始就应该这么说。

使类的所有构造函数成为内部的。为了从一个类继承,它必须有一个可访问的构造函数。如果您将所有构造函数设为内部,则只有该程序集中的类可以从基类继承。

【讨论】:

  • 不错。虽然我无法使用它,因为我使用的是 .Net 3.5
【解决方案2】:

据我所知,使用internal 是控制谁可以继承类的唯一方法。如果继承者必须在不同的程序集中,您可以使用 InternalsVisibleTo 属性让来自另一个程序集的类看到程序集的内部(必须对目标程序集进行签名才能使其与已签名的程序集一起使用)。

【讨论】:

  • 不错的答案,但您无需签署 InternalsVisibleTo 即可工作。
  • @Andy 感谢您的澄清。我忘了提到只有签名的程序集才需要签名。我决定首先提到签名,因为我记得我遇到了麻烦,以找出为什么我无法从未签名的单元测试程序集中测试已签名程序集的内部方法。
【解决方案3】:

有时使用的一个技巧是声明私有构造函数。这样你就可以实现:

public class A
{
     private A(){}

     // Here B can inherit from A
     public class B : A{}

 }

 // This is not allowed
 public class C : A{}

这是有其局限性的,因为只有在 A 中声明的类才能从 A 继承。我发现这个技巧对于区分大小写非常有用。

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多