對於其中的一個類,有必要實現一個克隆方法。所以我想弄清楚我是否需要複製參考或值複製類的事件。克隆對象時發生孤立事件嗎?
例如,讓我們說你有以下幾點:
Ball ballOne = new Ball();
ballOne.Bounce += new EventHandler(ballOne_Bounce);
Ball ballTwo = ballOne.Clone();
我應該怎麼寫的克隆方法,所以對於ballTwo的彈跳事件被觸發?
感謝, 泰勒
對於其中的一個類,有必要實現一個克隆方法。所以我想弄清楚我是否需要複製參考或值複製類的事件。克隆對象時發生孤立事件嗎?
例如,讓我們說你有以下幾點:
Ball ballOne = new Ball();
ballOne.Bounce += new EventHandler(ballOne_Bounce);
Ball ballTwo = ballOne.Clone();
我應該怎麼寫的克隆方法,所以對於ballTwo的彈跳事件被觸發?
感謝, 泰勒
public Ball Clone() {
... create the new instance ...
clone.Bounce = Bounce;
... set more properties ...
return clone;
}
委託是在.NET中引用類型,而且他們也不可改變的,所以「參考值對比」是沒有意義的。如果您想複製事件代理,只需複製它(即複製參考)。
這真的取決於你如何使用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;
}
}
但他不想複製事件委託,因爲這會指向ballOne not ballTwo right? – 2010-07-13 01:16:27
委託人對ballOne一無所知。它只引用ballOne_Bounce,這可能是在其他一些對象(表單?)上。 – 2010-07-13 01:19:01