2014-02-07 34 views
7

假設我在我的基類中有這個方法。如何強制派生方法遵循某種模式?

public virtual void Close() 
{ 
    if (!IsOpen) return; 

    Dispose(); 
    RaiseClosed(); 
} 

我想子類自由修改的方法,但要確保它調用Dispose()第一,然後再調用RaiseClosed()。他們可以在之前,之後或之間做任何事情。

我該如何強制兒童班在某些時候撥打Dispose()RaiseClosed()

編輯:我想我沒有很好地澄清這個問題。派生的方法可能會在Dispose()之前/之後和RaiseClosed()之前/之後執行某些操作。因此,確保按順序呼叫Dispose()RaiseClosed()是不夠的,因爲派生的方法可能會在兩者之間或甚至在RaiseClosed()之後執行某些操作。

+0

你只是在你的孩子中重寫該方法。在新方法中,您可以隨時調用Dispose()和RaiseClosed()。 – athabaska

+1

你知道一句老話:「如果你想要的東西做對,做你自己。」(http://en.wikipedia.org/wiki/Charles-Guillaume_%C3%89tienne)。 –

回答

11

一種方法是根本不製作Close a virtual方法。相反,有其專門設計用於被重寫的另一種方法,並呼籲從你的Close方法,它本身正確地強制執行您想要

public void Close() { 
    if (!IsOpen) return; 

    try { 
    CloseCore(); 
    } 
    finally { 
    Dispose(); 
    RaiseClosed(); 
    } 
} 

protected virtual void CloseCore() 
{ 
    // Derived types override this to customize their close 
    // behavior 
} 
+0

但是,如果派生方法想在'Dispose()'後面做些什麼呢? – CookieMonster

+0

@CookieMonster再添加另一種方法爲他們定製像'ClosePostDispose' – JaredPar

+1

@CookieMonster:這個所謂的「模板方法」(http://en.wikipedia.org/wiki/Template_method_pattern)。當您需要在派生類中擴展功能時,您只需添加新的虛擬方法。 – Dennis

1

首先聲明一種方法,在下面的方式不是虛的變體:

public void Close() 
{ 
    if (!IsOpen) return; 

    DoClosingStuff(); 

    Dispose(); 
    RaiseClosed(); 
} 

然後進行虛擬方法DoClosingStuff()

public virtual void DoClosingStuff() 
{ 
} 
+0

這是不同的形式[這個答案](http://stackoverflow.com/a/21621790/2530848)? –

+0

它不是!在我發佈我的信息後,我看到了這個答案。 – Trifon

0

沒有辦法,你可以強制在聲明。正如Jared所提議的那樣,您可以提供可以在預測幀中執行的方法模板。另一種避開這種情況的方式是使用事件,但基本上這種模式是相同的。你只需提供鉤子將代碼添加到...

public event Action BeforeDispose; 
public event Action AfterDispose; 

public virtual void Close() 
{  
    if (BeforeDispose != null) BeforeDispose.Invoke(); 
    Dispose(); 
    if (AfterDispose != null) AfterDispose.Invoke(); 
    RaiseClosed(); 
} 

這樣,你可以限制那種可以在你的模板類和子類可以處理這些事件或不理會他們進行委託類型。雖然,我不認爲這種方法比Jared的方法有優勢...

相關問題