如何在C#中创建类a,其中a只能由B、C、D继承?

如何在C#中创建类a,其中a只能由B、C、D继承?,c#,.net,inheritance,C#,.net,Inheritance,有一种机制允许一个类仅由C#?中的N个类继承。您可以将它及其派生类放在一个单独的程序集中,并将基类的构造函数声明为内部。这样,虽然您可以在不同的程序集中从它继承,但您无法实例化任何派生类。您可以将该类设为Abstract并在任意数量的类中继承它。否,但如果超出限制,您可以始终使构造函数抛出异常。仅供我个人参考,我想更多地了解使这样的设计选择成为可取的商业环境,因为我在阅读标题时的第一个想法是“哦,非常糟糕的主意!基类永远不应该知道任何东西(更糟糕的是:规则)它的派生类”。是B,C和D在同一个程序

有一种机制允许一个类仅由C#?

中的N个类继承。您可以将它及其派生类放在一个单独的程序集中,并将基类的构造函数声明为
内部
。这样,虽然您可以在不同的程序集中从它继承,但您无法实例化任何派生类。

您可以将该类设为Abstract并在任意数量的类中继承它。

否,但如果超出限制,您可以始终使构造函数抛出异常。

仅供我个人参考,我想更多地了解使这样的设计选择成为可取的商业环境,因为我在阅读标题时的第一个想法是“哦,非常糟糕的主意!基类永远不应该知道任何东西(更糟糕的是:规则)它的派生类”。

B
C
D
在同一个程序集中?这需要在运行时还是编译时进行。您这样做的具体原因是什么?也许一个实际的例子会有所帮助。如果有人能对此进行破解,那会很有趣。你怎么能继承但不能实例化?@Mehrdad:由于派生类调用基的构造函数,它必须能够访问该构造函数。对
internal
的访问只允许同一程序集中(或友元程序集中)的派生类调用基。还需要注意的是,派生类应该是
密封的
@Travis:但是如何强制派生类不被实例化?将构造函数设置为private,然后就没有人可以调用它。如果我没有错,OP希望将一个数字添加到可以从特定类继承的类的数量中,rest实例化应该是我认为在这种情况下=3@Tom当前位置请看Abatishchev给出的答案,我只是想说同样的。。我想在提示之后,发问者可以用谷歌搜索…在基类构造函数的哈希表中记录
this
的类型。我可以创建一个带标签的B、C和D的并集,方法是创建一个空的基类a,B C和D从中继承,但没有其他类继承。
// can be inherited only by classes in the same assembly
public abstract class A
{
    protected internal A() { }
}

// can't be inherited
public sealed class B : A
{
}