2010-07-13 56 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; 

    } 

}