对于VS2005中的C#,在继承的类中调用this()
会导致执行基础构造函数吗?
编辑:如何避免重新编写x
和y
作业?注意,我不希望MyObject(int num)构造函数执行base()构造函数。
public class MyObject : MyParentObject {
int x;
int y;
int z;
public MyObject() {
x = 5;
y = 10;
}
public MyObject(int num) : base(num) {
x = 5;
y = 10;
z = num;
}
答案 0 :(得分:5)
base()
将由第一个构造函数隐式调用,以在派生类中运行:
public MyObject() {
x = 5;
y = 10;
}
public MyObject(int setZ) : this() {
z = setZ;
}
相当于:
public MyObject() : base() {
x = 5;
y = 10;
}
public MyObject(int setZ) : this() {
z = setZ;
}
答案 1 :(得分:2)
除非显式调用参数化的基础构造函数,否则将无提示地调用无参数基本构造函数。
如果你有
class Base { }
class Foo : Base { public Foo() { } }
与说
没什么不同class Foo : Base { public Foo() : base() { } }
因此,如果您有Foo的参数化构造函数,无论您使用base()
做什么,都会调用this()
,除非您还有{{1}的参数化构造函数您明确调用的。
Base
无论哪种方式,基类都将通过无参数构造函数(隐式或显式)或通过参数化构造函数(显式)实例化 first 。
答案 2 :(得分:1)
我相信这是您正在寻找的语法:
class MainClass
{
MainClass()
{
//do something
}
}
class MyClass : MainClass
{
MyClass()
: base()
{
// do something else
}
}
调用base()将使它在当前构造函数之前运行基础构造函数。
答案 3 :(得分:1)
class BaseClass
{
BaseClass()
{
}
}
class MyClass : BaseClass
{
MyClass(int? id) : base()
{
}
MyClass() : this(null)
{
}
}
MyClass() : this(null)
将通过MyClass(int? id)
或者您可以交换它并以任意方式生成MyClass(int? id) : this()
和MyClass() : base()
,将调用基础构造函数。
如果没有指定任何内容,则调用无参数的构造函数(如果有的话),否则将导致编译器错误(如果你只有一个带参数的基础构造函数)
答案 4 :(得分:0)
您是否尝试不在任何时候实例化您的基类?那是不可能的;无论是否重写字段分配,都必须显式或隐式地调用基础构造函数。
听起来这不是你正在寻找的行为(因为它隐含地调用了base()
,但是你的代码也是如此),但这可以节省你的重写:
public class MyObject : MyParentObject {
int x;
int y;
int z;
public MyObject() {
x = 5;
y = 10;
}
public MyObject(int num) : this() {
z = num;
}
为什么要特别避免调用基类构造函数?