有没有办法限制谁可以继承类或接口?

时间:2011-12-25 21:28:22

标签: c# .net-3.5

我想知道是否有办法限制谁可以继承一个班级。

  • internal:不允许在程序集外继承类
  • sealed:类无法继承

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

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

我想要的例子:

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

3 个答案:

答案 0 :(得分:18)

  

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

是。如果继承代码部分受信任,则可以在基类上放置继承需求,如果不符合条件,运行时将不允许继承类加载需求:

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

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

我怀疑你正试图施加你真正不应该强加的限制。你能说出你为什么要做这件事吗?可能有更好的方法来做你想做的事。

更新:

  

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

然后你可能应该首先说过。

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

答案 1 :(得分:8)

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

答案 2 :(得分:0)

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

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继承。我发现这个技巧对于区分大小非常有用。