[英]C# Call base class' constructor after own constructor?
調用自己的構造函數后,如何調用基類的構造函數?
問題是,基類的構造函數調用一個抽象方法(在子類中重寫),它需要訪問變量x
,在子類的構造函數中初始化?
簡短的示例代碼:
abstract class BaseClass
{
protected string my_string;
protected abstract void DoStuff();
public BaseClass()
{
this.DoStuff();
}
}
class SubClass : BaseClass
{
private TextBox tb;
public SubClass()
: base()
{
this.my_string = "Short sentence.";
}
protected override void DoStuff()
{
// This gets called from base class' constructor
// before sub class' constructor inits my_string
tb.Text = this.my_string;
}
}
編輯:根據答案,這顯然是不可能的。 是否有自動調用this.DoStuff();
一旦創建了SubClass
每個對象? 當然我可以添加this.DoStuff();
在子類的構造函數中的所有其他行之后,但是有大約 100 個這樣的類,感覺很愚蠢。 任何其他解決方案,還是我應該使用手動解決方案?
你不能。
此外,您通常不應在構造函數中調用virtual
方法。 看到這個答案。
根據您的實際代碼而不是您編寫的簡單示例,您可以將值作為基本構造函數和DoStuff
方法的參數傳遞。 例如:
abstract class BaseClass
{
private string my_string;
protected abstract void DoStuff(string myString);
public BaseClass(string myString)
{
this.my_string = myString;
this.DoStuff(this.my_string);
}
}
class SubClass : BaseClass
{
private TextBox tb;
public SubClass()
: base("Short sentence.")
{
}
protected override void DoStuff(string myString)
{
tb.Text = myString;
}
}
如果您的實際代碼無法實現,那么編寫多個DoStuff()
就可以完成這項工作。 還要記住密封您的SubClass
類,這樣其他人就無法再次通過修改DoStuff
方法來引入錯誤。
我不會在構造函數中調用抽象方法,因為調用該方法的實例的構造函數可能沒有執行
當調用虛擬方法時,直到運行時才選擇執行該方法的實際類型。 當構造函數調用虛方法時,調用該方法的實例的構造函數可能尚未執行。 要修復違反此規則的情況,請不要從類型的構造函數中調用類型的虛擬方法。
http://msdn.microsoft.com/en-us/library/ms182331%28v=vs.80%29.aspx
你不能那樣做。 但是您可以將主類的啟動代碼放入單獨的 initialize 方法中。 然后,您可以在特定的構造函數中 > 在構造函數代碼之后調用該方法。
有沒有理由在類的構造函數實際運行之前不能構造它? 它需要對如何創建派生類承擔更大的責任,這可能不是最佳實踐,但它似乎有效。
abstract class BaseClass {
protected string my_string;
protected abstract void DoStuff();
public BaseClass() {
this.DoStuff();
}
}
class SubClass: BaseClass {
TextBox tb;
bool Constructed = false;
void Constructor() {
if (!Constructed) {
Constructed = true;
this.my_string = "Short sentence.";
}
}
public SubClass()
: base() {
Constructor();
}
protected override void DoStuff() {
Constructor();
// This gets called from base class' constructor
// before sub class' constructor inits my_string
tb.Text = this.my_string;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.