2012-12-14 43 views
1

是否有可能在類繼承中調用當前類方法?類的當前「級別」的調用方法

假設我們有一個類A和從A.繼承現在都已經是「初始化」的方法,這意味着它獲取B.重寫現在我不能使用「base.initialize」到B級從那裏調用A的「初始化」。相反,即時通訊嘗試從較低的類構造函數(所以A的構造函數)調用它,它被調用所有繼承類。

所以現在我想調用A的構造函數的「初始化」。但是當我嘗試的時候,B的重載構造函數被調用。所以有什麼東西可以告訴VS(或c#)我明確地調用了當前在類中的方法(this.method()不工作)?

+0

你確定它被覆蓋?嚴重的是,你想要完成什麼?可能有一種更直接的方式來實現你的目標。 –

+1

看起來你不應該重寫初始化方法。 –

+0

C#中的方法默認不是虛擬的 - 您必須使用'virtual'關鍵字來標記它們,然後在子類中的方法上使用'override'關鍵字。如果你這樣做,你絕對可以**使用'B'類中的'base.Initialize()'。 –

回答

1

如果您將方法Initialize標記爲虛擬,則表示派生類可以自由覆蓋該方法,可能不會在該過程中調用base.Initialize。如果發生這種情況並不好,則不要將該方法標記爲虛擬。

對你來說,這聽起來像你只需要兩個私人Initialize方法,每個類:

public class A 
{ 
    public A() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
    } 
} 

public class B : A 
{ 
    public B() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
    } 
} 

或者,你可能想看看Template Method design pattern。你可以這樣設計你的課程:

public class A 
{ 
    public A() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     // Initialize the base class A. 

     // Then call DerivedInitialize. If this is actually a derived object, 
     // DerivedInitialize will initialize the derived instance. Otherwise, 
     // it won't do anything. 
     DerivedInitialize(); 
    } 

    protected virtual void DerivedInitialize() 
    { 
    } 
} 

public class B : A 
{ 
    public B() 
    { 
     Initialize(); 
    } 

    protected override void DerivedInitialize() 
    { 
     // Initialize B-specific stuff... 
    } 
} 
+0

謝謝你的明確答案。特別是第二種可能性似乎很適合。 – user1557232

0

將您的A.initialize()的內容添加到新的私有非虛擬方法中。從A的構造函數和A.initialize()中調用這個新方法。