我可以在内部密封但外部密封吗?

时间:2010-11-05 02:10:03

标签: c# .net

在C#中是否可以创建一个可以从内部派生(未密封)的类,但是然后阻止其他人引用我的库从外部继承我的公共类(密封)?

3 个答案:

答案 0 :(得分:9)

我想你可以创建类internal的构造函数,以便只有程序集中的其他类可以从它们派生,如果你仍然需要创建该类的实例,你可以提供一个工厂方法来返回实例

编辑以添加样本:

public class MyFoo
{
    internal MyFoo()
    {
    }

    public static MyFoo CreateFoo()
    {
        return new MyFoo();
    }
}

答案 1 :(得分:5)

Eric Lippert指出了三种方法。 tl; dr:不要密封你的类,但是在你的类中包含一个内部抽象方法,或者让所有构造函数都是内部或私有的,或者使用PermissionSet属性向类中添加元数据。

http://blogs.msdn.com/b/ericlippert/archive/2008/09/26/preventing-third-party-derivation-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

答案 2 :(得分:0)

您也可以尝试这样做。

internal class InternalExtendible
{
    public string MyProperty { get; set; }
}

public sealed class ExternalSealedClass : InternalExtendible
{
}

创建一个Internal类并创建一个继承自内部类的公共空类。引用dll时,只有公共类对用户可见,但内部类的所有功能都将被公开。