2011-11-17 51 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对象,因此即使您正在覆盖主类中的引用,对象仍然保持活动状态事件并且在事件触发时仍然被调用。