C#:我可以在不使用基类构造函数的情况下创建继承类吗
本文关键字:情况下 创建 继承 构造函数 基类 我可以 | 更新日期: 2023-09-27 17:58:07
我需要使用构造函数创建一个继承类,而不是在基类中定义的?问题是,inherit类中的构造函数是否需要:base()
构造函数?如何在不更改基类的任何组件的情况下解决此问题?
否。创建派生类的实例总是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() { }
工作。这一定是因为您不能访问基类中定义的构造函数。现在的问题是,您是不想更改基类实现,还是根本不想更改。
您需要将基类构造函数的访问修饰符(可能是私有的或内部的)更改为protected或public。