如何拥有一个密封的构造函数

本文关键字:构造函数 密封 有一个 何拥 | 更新日期: 2023-09-27 18:10:01

我有一个基类,它有公共的构造函数。

基类不是密封的,也不是抽象的。

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

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

public sealed MyBase(string someParam)

附加:

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

public MyDerived() : base(string cant_access_my_sealed_constructor)

如何拥有一个密封的构造函数

你不能那样做。如果构造函数是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
    { }
}

所有构造函数都是"密封的",因为它们不能被"重写"。它们只能从子类的构造函数中调用。

如果你希望防止子类拥有具有相同签名的构造函数,那是不可能的。

根据您添加到文章中的附加信息,听起来您想要做的是将构造函数设为私有,正如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){
    }
}

如果想要防止继承类调用构造函数,只需将其标记为private。

构造函数不能被子类继承,如果需要,必须显式调用基构造函数。

当子类的实例被实例化时,这段代码将调用基类的无参数构造函数。如果没有它,在创建子类的新实例时将不会调用基类的构造函数。

public class A
{
    public A() 
    {
    }
}
public class B : A
{
    public B() 
        : base() 
    {
    }
}