2010-06-30 51 views
2

對於VS2005中的C#,會在繼承類中調用this()導致基構造函數的執行?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; 
} 
+0

您必須調用基礎構造函數,也許繼承不是您需要的解決方案。 – PostMan 2010-06-30 03:34:52

回答

1

我相信這是你正在尋找的語法:

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

} 

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

} 

調用基地()將導致其目前的構造函數之前運行基本構造。

+0

有趣。我先回答,然後你回答同樣的問題,突然間我的回答只有一個投票。嘖嘖,我不知道這裏發生了什麼事。 – 2010-06-30 03:00:04

+1

無論你是否調用'base()',它仍然會在派生類構造函數之前運行,假設基類有一個無參數構造函數*並且*你沒有顯式調用參數化的基構造函數。無論如何,基類將在派生類之前構建。 – 2010-06-30 03:01:44

+0

這個答案沒有錯,但沒有必要。而@埃斯特班,我是那個推倒你的人。 – 2010-06-30 03:05:42

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
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()無論哪種方式,基礎構造函數都會被調用。

的paramater的構造函數(如果有的話)是,如果沒有指定被調用,或將導致一個編譯器錯誤(如果你只有一個帶參數的基礎構造)

2

的參數的基礎構造函數被調用隱含,除非你明確地調用參數化的基礎構造函數。

如果你有

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

這無異於說

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

所以,如果你有一個富一個參數的構造函數,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 */ 
} 

無論哪種方式,基類將被實例第一既可以通過參數的構造函數(或隱式地)或通過參數的構造函數(明確)。

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

爲什麼特別是你想避免調用基類的構造函數?