仅在C#中的程序集内部可继承

Ram*_*esh 12 c# oop inheritance

在C#中,有没有办法指定一个类只能由同一程序集中存在的类继承,而其他程序集应该像公共密封类型一样.

Mar*_*ell 16

我认为Eric Lippert在这里得到了定义的引用:


Mic*_*ows 14

语言本身没有任何使这很容易的东西,但你应该能够通过使你的构造函数内部来做到这一点.但是,如果这样做,您将无法从外部程序集中新建它,因此您必须添加工厂方法.

public class Foo
{
    internal Foo()
    {
    }

    public Foo Create()
    {
        return new Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个替代方案,可以让您在外部程序集中新建类

public sealed class Foo : FooBase
{

}

public class FooBase
{
    internal FooBase() { }
}
Run Code Online (Sandbox Code Playgroud)

但是,您可能会问自己的一个问题就是您希望密封课程的原因.有时这是不可避免的,但我已经看到sealed关键词经常被滥用,以至于我认为我会提起它.通常,开发人员会密封类,因为它们对代码过度保护. 大多数情况下,如果一个类设计得很好,就不需要密封.


And*_*ott 5

如果你的类是抽象的,那么有一个非常简单的方法:

public abstract class Foo {
    internal abstract void DoNothing();
    // ... other members
}
Run Code Online (Sandbox Code Playgroud)

现在,尽管您的类和大多数成员都是公共的,但内部抽象成员使得无法从程序集外部的类派生.