如何使用密封的构造函数?

Val*_*mas 1 c# constructor sealed

我有一个有公共结构的基类.

基类没有密封,也不是抽象的.

有一个我希望密封的构造函数.这可能吗?

我当前的尝试导致语法错误,说不能密封构造函数.

public sealed MyBase(string someParam)
Run Code Online (Sandbox Code Playgroud)

额外:

我希望能够直接实例化基类并有权访问密封的构造函数.派生类不能通过派生构造函数使用该构造函数.例如

public MyDerived() : base(string cant_access_my_sealed_constructor)
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 8

你不能这样做.如果是构造函数public,则可以从派生类的构造函数中调用它.但是你可以做一些接近的事情 - 你可以有一个private构造函数和一个public static调用它的方法:

class MyBase
{
    private MyBase(string someParam)
    {
        // some code
    }

    public static MyBase Create(string someParam)
    {
        return new MyBase(someParam);
    }

    protected MyBase() // or some other protected or public constructor
    { }
}

class MyDerived : MyBase
{
    public MyDerived()
        : base("foo") // won't compile, as requested
    { }
}
Run Code Online (Sandbox Code Playgroud)


Str*_*ior 6

所有构造者都被"密封",因为它们不能被"覆盖".它们只能从子类的构造函数中调用.

如果您希望防止子类具有相同签名的构造函数,则无法完成.

基于您添加到帖子中的其他信息,听起来您想要做的就是让您的构造函数保密,就像Kyle建议的那样.这将阻止子类调用构造函数,但它不会阻止它使用相同类型的参数:

public class Foo
{
    private Foo(string s){
    }
    // Allowed
    public Foo() : this("hello") {
    }
}

public class Bar : Foo
{
    // Allowed
    public Bar(string s) : base(){
    }
    // Not allowed
    public Bar(string s) : base(s){
    }
}
Run Code Online (Sandbox Code Playgroud)