如何防止类在库外被继承,同时被公共类继承

  • 本文关键字:继承 何防止 c#
  • 更新时间 :
  • 英文 :


假设我在库中有以下类

public abstract class HiddenBaseClass
{
//stuff
}
public abstract class ClassA : HiddenBaseClass
{
//stuff
}
public abstract class ClassB : HiddenBaseClass
{
//stuff
}

我想防止HiddenBaseClass在库外被继承,但我确实希望ClassAClassB被继承。我不能将HiddenBaseClass设为internal class,因为这意味着HiddenBaseClass的可访问性不如ClassAClassB

有办法绕过这个吗?

与对该问题的评论相反,我相信如果HiddenBaseClass有一些方面需要依赖于内部实现(因为您信任内部实现(,但公开其他抽象操作供外部代码实现,那么这种场景是有意义的。它可能不是适合您用例的设计,但它并非不合理。

让它不可能直接在同一个库之外继承的一个简单方法是给它一个内部构造函数:

public abstract class HiddenBaseClass
{
// Only classes in the same assembly can chain to this constructor.
internal HiddenBaseClass() {}
}

只要类中的所有构造函数都是内部的(或私有保护的,或私有的(,这将阻止其他程序集中的类将其的构造函数链接到基类构造函数,从而阻止继承。

正如评论礼貌地指出的那样,这不是这种场景的最佳结构。最后,我要实现这样一个:

internal sealed class HiddenBaseClass
{
//stuff
}
public abstract class ClassA
{
internal HiddenBaseClass { get; set; }
//stuff that uses HiddenBaseClass
}
public abstract class ClassB
{
internal HiddenBaseClass { get; set; }
//more stuff
}

我为再次提出错误的问题而道歉。

最新更新