簡體   English   中英

C#在自己的構造函數之后調用基類的構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM