如何在不使用 MemberwiseClone 的情况下在抽象 class 上实现 Clone 方法?
How can I implement a Clone method on an abstract class without using MemberwiseClone?
我有一个抽象基 class 定义如下:
public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
// Various Properties...
public event public event PropertyChangedEventHandler PropertyChanged;
public object Clone()
{
var clone = (BaseItem)MemberwiseClone();
return clone;
}
}
派生的 classes 继承并使用基础 class 的 Clone 方法,这样它们就不必实现自己的 Clone 方法(加上一些额外的、不相关的原因)。
一般来说,这段代码可以正常工作。唯一的问题是有一个不需要的副作用。因为我正在使用 MemberwiseClone 来克隆实例,所以引用类型是浅拷贝的,不幸的是,这包括事件。因此,任何已订阅原始实例上的事件的对象也将订阅克隆实例上的事件。就是这个问题。
有什么方法可以使用 BaseItem.Clone 方法克隆 BaseItem 派生的 class 的实例 而无需 也克隆事件?
正如@JohnWu 在评论中提到的,对我有用的解决方案是将事件处理程序设置为 null 以删除其所有订阅者。
public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
// Various Properties...
public event PropertyChangedEventHandler PropertyChanged;
public object Clone()
{
var clone = (BaseItem)MemberwiseClone();
clone.PropertyChanged = null;
return clone;
}
}
我有一个抽象基 class 定义如下:
public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
// Various Properties...
public event public event PropertyChangedEventHandler PropertyChanged;
public object Clone()
{
var clone = (BaseItem)MemberwiseClone();
return clone;
}
}
派生的 classes 继承并使用基础 class 的 Clone 方法,这样它们就不必实现自己的 Clone 方法(加上一些额外的、不相关的原因)。
一般来说,这段代码可以正常工作。唯一的问题是有一个不需要的副作用。因为我正在使用 MemberwiseClone 来克隆实例,所以引用类型是浅拷贝的,不幸的是,这包括事件。因此,任何已订阅原始实例上的事件的对象也将订阅克隆实例上的事件。就是这个问题。
有什么方法可以使用 BaseItem.Clone 方法克隆 BaseItem 派生的 class 的实例 而无需 也克隆事件?
正如@JohnWu 在评论中提到的,对我有用的解决方案是将事件处理程序设置为 null 以删除其所有订阅者。
public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
// Various Properties...
public event PropertyChangedEventHandler PropertyChanged;
public object Clone()
{
var clone = (BaseItem)MemberwiseClone();
clone.PropertyChanged = null;
return clone;
}
}