簡體   English   中英

從基礎構造函數調用重寫的方法

[英]Calling an overridden method from base constructor

我們有一個這樣的課:

class LogAnalyzer
    {
        protected IExtensionManager manager;

        public  LogAnalyzer()
        {
            GetManager();
        }

        protected virtual void GetManager()
        {
            manager = new FileExtensionManager();
        }
    }

我們派生出另一個這樣的類:

class TestableLogAnalyzer:LogAnalyzer
    {
        protected override void GetManager()
        {
            this.manager = new StubExtensionManager();
        }
    }

當我們實例化子類時,應該在OOP規則中發生什么? 是否調用虛擬方法或重寫方法,為什么? 我在C#中進行了測試,並且覆蓋了方法,但我懷疑它可能是解釋語言的另一種方式。 真的嗎?

提供與語言無關的答案並不簡單,因為“會發生什么”取決於語言本身。 例如,在Java中,將調用重寫的(虛擬)方法,但這可能會出現問題,因此不推薦使用。

您需要查閱您感興趣的文檔或語言規范,然后四處閱讀以查看是否有人發表了關於您為什么應該或不應該這樣做以及可能出問題的意見,例如Scott Meyers的文章AraK在他/她的評論中鏈接。

由於它是語言不可知的,我將使用C ++作為基礎,並希望可以推斷出這些建議。

LogAnalyser的構造方法在TestableAnalyser的構造方法之前調用。 這意味着在其工作期間TestableAnalyser尚未構建,因此調用虛擬方法可能很危險(它們可能使用未初始化的數據)。

在您的情況下,派生類希望影響其基類的初始化。 虛擬方法覆蓋不是執行此操作的唯一方法。 您可以再創建一個接受管理器的構造函數,派生類將傳遞“ new StubExtensionManager();”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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