2010-07-13 54 views
0

对于其中的一个类,有必要实现一个克隆方法。所以我想弄清楚我是否需​​要复制参考复制类的事件。克隆对象时发生孤立事件吗?

例如,让我们说你有以下几点:

Ball ballOne = new Ball(); 
ballOne.Bounce += new EventHandler(ballOne_Bounce); 

Ball ballTwo = ballOne.Clone(); 

我应该怎么写的克隆方法,所以对于ballTwo的弹跳事件被触发?

感谢, 泰勒

回答

1
public Ball Clone() { 
    ... create the new instance ... 
    clone.Bounce = Bounce; 
    ... set more properties ... 
    return clone; 
} 

委托是在.NET中引用类型,而且他们也不可改变的,所以“参考值对比”是没有意义的。如果您想复制事件代理,只需复制它(即复制参考)。

+0

但他不想复制事件委托,因为这会指向ballOne not ballTwo right? – 2010-07-13 01:16:27

+0

委托人对ballOne一无所知。它只引用ballOne_Bounce,这可能是在其他一些对象(表单?)上。 – 2010-07-13 01:19:01

0

这真的取决于你如何使用Ball对象以及如何去克隆它。它也很大程度上取决于听众正在做什么。

如果您想让ballOne和ballTwo拥有完全相同的注册事件侦听器,那么您可以将ballOne中的事件处理器引用传递给ballTwo,它们都应该可以工作。但请记住,如果您随后为ballOne添加了新的事件侦听器,那么ballTwo也不会获得它。

我不确定你想要做什么,但是当你遍地都有很多克隆球时,会导致内存泄漏和很多麻烦,而且你不知道哪些是有的哪些事件监听器。

你可能更适合在任何持有球的类上创建一个方法,以便它可以添加适当的事件侦听器。

public class Box 
{ 

    public void InitializeBalls() 
    { 
     Ball ballOne = new Ball(); 
     this.RegisterBall(ballOne); 

     Ball ballTwo = ballOne.Clone(); 
     this.RegisterBall(ballTwo); 

    } 


    public void Ball_Bounce() 
    { 
    } 

    public void RegisterBall(Ball ball) 
    { 
     ball.Bounce += Ball_Bounce; 
    } 

} 

public class Ball 
{ 

    public event BounceEventHandler Bounce; 
    public delegate void BounceEventHandler(); 


    public Ball Clone() 
    { 
     Ball clonedBall = null; 
     // Do some fancy clonin' 
     return clonedBall; 

    } 

}