У меня есть абстрактный базовый класс, определенный следующим образом:
public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
// Various Properties...
public event public event PropertyChangedEventHandler PropertyChanged;
public object Clone()
{
var clone = (BaseItem)MemberwiseClone();
return clone;
}
}
Производные классы наследуют и используют метод Clone базового класса, поэтому им не нужно реализовывать свои собственные методы Clone (плюс некоторые дополнительные, не относящиеся к делу причины).
Как правило, этот код работает так, как задумано. Единственная проблема заключается в том, что есть нежелательный побочный эффект. Поскольку я использую MemberwiseClone для клонирования экземпляра, ссылочные типы копируются неглубоко, что, к сожалению, включает события. Таким образом, любые объекты, которые подписались на события в исходном экземпляре, также будут подписаны на события в экземпляре клона. Это проблема.
Есть ли способ создать клон экземпляра класса, производного от BaseItem, с помощью метода BaseItem.Clone без клонирования событий?
MemberwiseClose
- этоextern
, поэтому было бы довольно сложно скопировать + вставить + изменить его, чтобы делать то, что вы хотите. Я предлагаю вам позвонитьMemberwiseClone
, а затем использовать эту технику чтобы удалить обработчики событий постфактум. - person John Wu   schedule 15.01.2021clone.PropertyChanged = null;
. Если у вас есть обработчик событий, вам не нужно идти сложным путем, упомянутым @JohnWu. - person ckuri   schedule 15.01.2021Clone
с правильной семантикой копирования. Чтобы получить возвращаемое значениеDerivedClass
, вы можете использовать Удивительно повторяющийся шаблон шаблона а>public abstract class BaseItem<T> where T : BaseItem<T>
- person Charlieface   schedule 17.01.2021