2011-06-16 310 views
15

標題可能聽起來令人困惑。 我想要的是在構造函數中調用相同類的構造函數和基類的構造函數。 也許我的解決可能解釋我的問題第一次嘗試:構造函數中的調用基構造函數和其他構造函數

public MyClass(MyClass obj) : base(obj),this() {} 

但是符號不工作。 有沒有解決方案來解決這個問題?

+2

如果你的參數的構造函數('這個()')指定一個不同的基類的構造函數(它隱含那樣 - 參的一個 - 如果沒有指定)。應該調用哪個基類構造函數? – 2011-06-16 07:20:18

回答

12

不,你不能,原因如下做到這一點:

當一個構造函數調用它的基礎的構造函數,後者調用是有問題的構造的一部分。所以,你不能調用同一個類的另一個構造和基類的構造函數,因爲前者的呼叫已經包含到基本構造函數的調用 - 你不能初始化你的基地兩次

1

您可以簡單地將構造函數代碼複製到給定的構造函數中。或者從默認的構造函數和這個構造函數中調用一個特殊的setup()函數。

+0

感謝您的信息。是的,這是我考慮的解決方案。但我希望可能有一種解決方案,比如在構造函數中調用base()和this(),就像在例如可能的情況下一樣。 Java的。 – Kai 2011-06-16 07:16:42

2

這種沒有技術解決方案,需要一個解決辦法,將邏輯被默認的構造函數,使基地在你的超一流的呼叫比重寫虛函數。

+0

在構造函數中調用虛擬方法通常不是很好的風格。 – leppie 2011-06-16 07:18:35

+0

你的意思是「讓基類調用什麼東西」,或者「做點基調」?另外,爲什麼要覆蓋基類內的虛函數?虛擬函數將在子類中被覆蓋。 – 2011-06-16 07:18:38

+0

調用虛擬方法不是解決此問題的好方法。參見: http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx 和埃裏克的評論2008年2月18日下午6:50 – thekip 2011-06-16 07:21:27

0

在C#中,你還可以在聲明中爲每個成員提供一個缺省初始化:

private int foo_ = 41; 

這解決了許多用其他構造函數的問題。

2

一種方法是使MyClass的無參數構造函數調用base(obj)。但是,如果你不總是想這樣做,比我認爲沒有一個好方法。

也許你可以嘗試在這些構造函數中移動東西。你能發佈更多關於這些構造函數實際發生的信息嗎?

+0

這是爲了實現複製構造函數。這樣我可以調用無參數構造函數的「默認東西」,並可以調用基礎構造函數。 – Kai 2011-06-16 07:19:17

+0

你不能把無參數構造函數的「默認東西」放在底部嗎?或者只是將它複製到其他構造函數? – 2011-06-16 07:24:49

5

C#允許使用基地(...)或本(...),因爲每一個構造函數必須調用最後一個超級構造函數。因此,如果可以同時調用base()和this(),則會發生兩個超級構造函數調用,這從根本上是不正確的。

這就是爲什麼它不可能調用base(...)兩次的原因。

+0

好吧,我明白爲什麼它不可能像我試過的那樣解決它。所以看來我必須使用一種解決方法。 – Kai 2011-06-16 07:21:40

+0

請仔細閱讀所有其他人的答案 – Nick 2011-06-16 07:25:06

-1

其實,你可以這樣做, 可以火從子類的實例父類的構造,這裏是你如何做到這一點:

public class Person 
{ 
    public Person(int age) { 
     this.Age = age; 
    } 
    public int Age; 
} 

public class students :Person 
{ 
    public students(string name, int age) :base(age) 
    { 
     this.studentName = name; 
     this.Age = age; 
    } 

    public string studentName; 
} 

現在,假設你正在創建學生對象類, 所以,你會做到這一點:

學生STD =新的學生( 「傑克」,23);

這將發送「傑克」學生類的構造函數,並且23將通過被髮送到人的構造函數:基地(年齡)

希望這有助於, 乾杯。

相關問題