我想知道是否有办法限制谁可以继承一个班级。
internal
:不允许在程序集外继承类sealed
:类无法继承是否有关键字或方法只允许某些类(仅从它自己的命名空间中说)来继承该类?
另外,我不希望这个特殊类是通用的。 我关心的不是安全,而是一般的设计。
我想要的例子:
答案 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继承。我发现这个技巧对于区分大小非常有用。