2011-11-17 48 views
3
public Class A 
{ 

    public A() 
    { 
    someotherclass.someevent += new EventHandler(HandleEvent); 
    } 

    private void HandleEvent(object sender,CustomEventArgs e) 
    { 
     if(e.Name == "Type1") 
      Method1(); 
     else if(e.Name == "Type2") 
      Method2(); 
    } 

    protected virtual void Method1(){} 
    protected virtual void Method2(){} 
} 

public class B: A 
{ 
    public B() 
    { /*Something*/} 

    protected override void Method1(){/*some logic*/} 
    protected override void Method2(){/*some other logic*/} 
} 

public class C: A 
{ 
    public C() 
    { /*Something*/} 

    protected override void Method1(){/*some logic*/} 
    protected override void Method2(){/*some other logic*/} 
} 

public class Main 
{ 
    private A; 

    public Main(){/*Something*/} 

    private void StartB() 
    { 
     A = new B(); 
    } 

    private void StartC() 
    { 
     A = new C(); 
    } 
} 

,發生的事情是,我經過一個循環,這兩種方法STARTB(稱爲第一)和StartC(稱爲第二)被調用,someevent被觸發時,代碼後試圖在B級執行方法後來C類,我希望,我不能到那裏,因爲它出現了錯誤時,它調用B中類的方法),而不是我想它來調用只有方法C類錯誤派生類方法對事件執行?現在

我認爲,由於事件是在構造認購,B類方法仍然被解僱,因爲它最初認購的STARTB的召喚。

問:
我只想被實例化應執行最新的類的方法。

例如:如果STARTBStartC被稱爲以,當someevent被觸發C類的方法只能得到執行。相同的副Versa。怎麼做?

我知道我做一些可怕的錯誤。任何幫助深表感謝。

+0

什麼問題?你說的是正確的,但你沒有問過任何問題 – flipchart

回答

3

你是不是從事件從你的第一個實例退訂所以它會被調用。如果你不想讓它被調用,你需要退訂。您可以做這樣的事情

class A 
{ 

private static EventHandler lastHandler; 

public A() 
{ 
    //warning, not thread safe 
    if(lastHandler != null) 
    { 
     someotherclass.someevent -= lastHandler; 
    } 
    lastHandler = new EventHandler(HandleEvent); 
    someotherclass.someevent += lastHandler; 
} 

,但它似乎很哈克。在創建新方法之前,您可能最好實施一種方法(例如IDisposable)來清理最後一個實例。

+0

謝謝Yaur。在創建新實例之前,我在Dispose方法中實現了IDisposable接口並取消訂閱該事件。這工作! –

1

如果我理解你正確地你說B上的方法startC之後被稱爲被調用,您不希望這樣的事情發生?

我猜你的問題是其他類是一個靜態類,或者某個實例在所有創建的B和C之間共享 - 在這種情況下,當你需要從其他class.someevent註銷舊事件處理程序創建新的課程。如果不註銷處理程序,那麼其他類對象將引用註冊它的B或C對象,因此即使您正在覆蓋主類中的引用,對象仍然保持活動狀態事件並且在事件觸發時仍然被調用。