Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使一个类内部未密封,但外部密封吗?_C#_.net - Fatal编程技术网

C# 我可以使一个类内部未密封,但外部密封吗?

C# 我可以使一个类内部未密封,但外部密封吗?,c#,.net,C#,.net,在C#中,是否可以生成一个可以从内部派生的类(未密封),但防止外部引用我的库的其他人从我的公共类继承(已密封)?我想您可以将类的构造函数设置为内部,以便只有程序集中的其他类可以从中派生,如果仍然需要创建该类的实例,可以提供一个工厂方法来返回实例 编辑以添加示例: public class MyFoo { internal MyFoo() { } public static MyFoo CreateFoo() { return new My

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

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

编辑以添加示例:

public class MyFoo
{
    internal MyFoo()
    {
    }

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

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


您也可以尝试这样做

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

public sealed class ExternalSealedClass : InternalExtendible
{
}

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

我有过这样的想法,但最大的问题是,如果有公共可访问的方法使用或返回此类型,那么签名是什么?如果您使用
ExternalSealedClass
,您的“真正”继承人将不合格。如果使用
InternalExtensible
,您的方法就不能再公开了。@mquander您不能通过编程到接口来解决这个问题吗?i、 e.您的签名看起来像“作废DoSomething(IExtendableOrSealed item){…}”