我需要使用构造函数创建继承类,而不是在 base 类中定义?问题是,继承类中的构造函数需要:base()
构造函数吗?如果不更改 base 类的任何组件,如何解决此问题?
答案 0 :(得分:8)
没有。创建派生类的实例总是 1 意味着明确地或隐式地(并且可能间接地,通过派生类中的其他构造函数)链接到基类构造函数。 / p>
但它不一定是无参数构造函数。例如,您可以:
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 好的,可能是奇怪的情况,由于序列化或其他类似的魔法,根本没有调用构造函数。忽略那些......
答案 1 :(得分:2)
使用具有不同于基类的构造函数的继承类没有任何问题:
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;
}
}
答案 2 :(得分:0)
如果没有构造函数,就无法实现一个类。即使您没有定义 any,默认构造函数也可以作为public BaseClass() { }
。这一定是因为您无法访问基类中定义的构造函数。现在的问题是你是否想要改变基类实现,或者你根本不想改变它。
您需要将基类构造函数(可能是私有或内部)的访问修饰符更改为受保护或公共。