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

问题描述 投票:8回答:3

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

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

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

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

我想要的例子:

  • A级
  • B类继承自A
  • C类不能从A继承
c# .net-3.5
3个回答
18
投票

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

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

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

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

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

更新:

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

那么你可能应该首先说出来。

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


8
投票

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


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

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