C#:我可以在不使用基类构造函数的情况下创建继承类吗

本文关键字:情况下 创建 继承 构造函数 基类 我可以 | 更新日期: 2023-09-27 17:58:07

我需要使用构造函数创建一个继承类,而不是在基类中定义的?问题是,inherit类中的构造函数是否需要:base()构造函数?如何在不更改基类的任何组件的情况下解决此问题?

C#:我可以在不使用基类构造函数的情况下创建继承类吗

否。创建派生类的实例总是1意味着链接到基类构造函数,无论是显式还是隐式(可能通过派生类中的其他构造函数间接链接)。

不过,它不一定是无参数构造函数。例如,您可以有:

public class Base
{
    private readonly int id;
    public Base(int id)
    {
        this.id = id;
    }
}
public class Derived : Base
{
    public Derived(int id) : base(id)
    {
    }
}

不过,用于基类构造函数参数的值不必与参数直接相关。例如,使用与上面相同的基类,可以有:

public class Derived : Base
{
    private readonly string name;
    public Derived(string name) : base(name.Length)
    {
        this.name = name;
    }
    public Derived() : base(-1)
    {
        this.name = null;
    }
}

重要的是,每个类都要确保它是以有效的方式构造的。例如,Base可能会验证id是偶数,或者类似的东西——如果在创建派生类的实例时可以绕过验证,那就太糟糕了,因为Base中的其他代码就不能依赖它


1好吧,可能是一些奇怪的情况,因为序列化或其他类似的魔术,根本没有调用构造函数。忽略这些。。。

继承类的构造函数与基类的参数不同并没有错:

public class Parent
{
    public int Value { get; set; }
    public Parent()
    {
        Value = 5;
    }
}
public class Child : Parent
{
    public string Text { get; set; }
    public Child(string text)
        : base()  //note this line can be omitted; the compiler will add it automatically
    {
        Text = text;
    }
}

如果没有构造函数,就不可能实现类。即使您没有定义任何,默认构造函数也可以作为public BaseClass() { }工作。这一定是因为您不能访问基类中定义的构造函数。现在的问题是,您是不想更改基类实现,还是根本不想更改。

您需要将基类构造函数的访问修饰符(可能是私有的或内部的)更改为protectedpublic