標題可能聽起來令人困惑。 我想要的是在構造函數中調用相同類的構造函數和基類的構造函數。 也許我的解決可能解釋我的問題第一次嘗試:構造函數中的調用基構造函數和其他構造函數
public MyClass(MyClass obj) : base(obj),this() {}
但是符號不工作。 有沒有解決方案來解決這個問題?
標題可能聽起來令人困惑。 我想要的是在構造函數中調用相同類的構造函數和基類的構造函數。 也許我的解決可能解釋我的問題第一次嘗試:構造函數中的調用基構造函數和其他構造函數
public MyClass(MyClass obj) : base(obj),this() {}
但是符號不工作。 有沒有解決方案來解決這個問題?
不,你不能,原因如下做到這一點:
當一個構造函數調用它的基礎的構造函數,後者調用是有問題的構造的一部分。所以,你不能調用同一個類的另一個構造和基類的構造函數,因爲前者的呼叫已經包含到基本構造函數的調用 - 你不能初始化你的基地兩次
您可以簡單地將構造函數代碼複製到給定的構造函數中。或者從默認的構造函數和這個構造函數中調用一個特殊的setup()函數。
感謝您的信息。是的,這是我考慮的解決方案。但我希望可能有一種解決方案,比如在構造函數中調用base()和this(),就像在例如可能的情況下一樣。 Java的。 – Kai 2011-06-16 07:16:42
這種沒有技術解決方案,需要一個解決辦法,將邏輯被默認的構造函數,使基地在你的超一流的呼叫比重寫虛函數。
在構造函數中調用虛擬方法通常不是很好的風格。 – leppie 2011-06-16 07:18:35
你的意思是「讓基類調用什麼東西」,或者「做點基調」?另外,爲什麼要覆蓋基類內的虛函數?虛擬函數將在子類中被覆蓋。 – 2011-06-16 07:18:38
調用虛擬方法不是解決此問題的好方法。參見: 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
在C#中,你還可以在聲明中爲每個成員提供一個缺省初始化:
private int foo_ = 41;
這解決了許多用其他構造函數的問題。
一種方法是使MyClass
的無參數構造函數調用base(obj)
。但是,如果你不總是想這樣做,比我認爲沒有一個好方法。
也許你可以嘗試在這些構造函數中移動東西。你能發佈更多關於這些構造函數實際發生的信息嗎?
這是爲了實現複製構造函數。這樣我可以調用無參數構造函數的「默認東西」,並可以調用基礎構造函數。 – Kai 2011-06-16 07:19:17
你不能把無參數構造函數的「默認東西」放在底部嗎?或者只是將它複製到其他構造函數? – 2011-06-16 07:24:49
其實,你可以這樣做, 可以火從子類的實例父類的構造,這裏是你如何做到這一點:
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將通過被髮送到人的構造函數:基地(年齡)
希望這有助於, 乾杯。
如果你的參數的構造函數('這個()')指定一個不同的基類的構造函數(它隱含那樣 - 參的一個 - 如果沒有指定)。應該調用哪個基類構造函數? – 2011-06-16 07:20:18