12

我想创建一个可以从同一个程序集中的类型继承的类型,但不能从程序集的外部继承。我确实希望该类型在程序集之外可见。

这可能吗?

4

2 回答 2

20

您可以将构造函数设为内部:

public class MyClass
{
    internal MyClass() { }
}

从基类派生的每个类都必须在其构造函数中调用基类的构造函数。如果基类在不同的程序集中,它就不能调用构造函数,所以派生类不能编译。

于 2010-06-18T18:12:57.937 回答
1

我认为这个问题仍然可以从语义上正确的答案中受益......这是“否”。您不能将类型声明为“仅密封到外部程序集”。

不要误会我的意思:dtb 的回答很好。内部构造函数是您可以从所需结果中获得的最接近的构造函数。

但是,我认为任何阅读本文的人都应该知道,在这个例子中,MyClass不会被描述为在运行时被密封。这不太可能成为问题,但如果可能导致基于反射的逻辑(来自您的代码或第 3 方库)对这种特定类型采取不同的行动。这是要记住的事情。

现在,进一步扩展 dtb 的示例代码:

public class MyClass
{
    internal MyClass() { }

    // This factory method will be accessible from external assemblies, making your class instantiable yet still "sealed"
    public static MyClass Create()
    {
        return new MyClass();
    }
}

这样,您仍然可以MyClass从拥有程序集的外部创建实例,同时仍然保持对继承的控制。

于 2018-10-12T19:59:28.283 回答