繁体   English   中英

VS2005中的C#:this()会为继承的类执行基础构造函数代码吗?

[英]C# in VS2005: will this() execute the base constructor code for an inherited class?

对于VS2005中的C#,在继承的类中调用this()会导致执行基础构造函数吗?

编辑:我怎样才能避免重写xy分配? 注意,我希望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; 
} 

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;
}

除非您显式调用参数化的基础构造函数,否则将无提示地调用无参数基本构造函数。

如果你有

class Base { }
class Foo : Base { public Foo() { } }

这与说法没有什么不同

class Foo : Base { public Foo() : base() { } }

因此,如果你有一个Foo的参数化构造函数,无论你用this()做什么,都会调用base() this() 除非你还有一个你明确调用的Base的参数化构造函数。

class Base
{
    public Base() { }
    public Base(int bar) { }
}

class Foo : Base
{
    public Foo() : base() { }
    public Foo(int bar) : base(bar) { }
    // also legal: 
    // public Foo() : base(1) { }
    // public Foo(int bar) : base(1) { }
    // public Foo(int bar) : base() { }
    // public Foo(int bar) { } /* uses implicit call to base() */
    // public Foo() { } /* ditto */
}

无论哪种方式,基类将首先通过无参数构造函数(隐式或显式)或通过参数化构造函数(显式)进行实例化。

我相信这是您正在寻找的语法:

    class MainClass
{
    MainClass()
    {
        //do something
    }

}

class MyClass : MainClass
{
    MyClass()
        : base()
    {
        // do something else
    }

}

调用base()将使它在当前构造函数之前运行基础构造函数。

class BaseClass
{
   BaseClass()
   {

   }
}

class MyClass : BaseClass
{
   MyClass(int? id) : base()
   {

   }

   MyClass() : this(null)
   {

   }
}

MyClass() : this(null)将通过MyClass(int? id)调用base MyClass(int? id)

或者你可以交换它并使MyClass(int? id) : this()MyClass() : base()无论哪种方式,都将调用基础构造函数。

如果没有指定任何内容,则调用无参数的构造函数(如果有的话),否则将产生编译器错误(如果您只有一个带参数的基础构造函数)

你试图不在任何时候实例化你的基类? 那是不可能的; 无论是否重写字段分配,您都必须显式或隐式地调用基础构造函数。

听起来这不是你正在寻找的行为(因为它隐式地调用了base() ,但是你的代码也是如此),但这可以节省你的重写:

public class MyObject : MyParentObject { 

int x; 
int y; 
int z; 

public MyObject() { 
    x = 5; 
    y = 10; 
} 

public MyObject(int num) : this() { 
    z = num; 
}

为什么要特别避免调用基类构造函数?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM