Проблема: некоторый подкласс может переопределить событие, что приведет к неожиданному поведению при построении
public class Boom<T> : ObsCol<T>
{
public override event NotifyCollectionChangedEventHandler CollectionChanged
{
add { throw new NotImplementedException(); }
remove { }
}
}
Решения:
Использовать OnCollectionChanged
переопределить
public class Solution1<T> : ObservableCollection<T>
{
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
DoSomething();
base.OnCollectionChanged(e);
}
...
}
Печать класса
public sealed class Solution2<T> : ObservableCollection<T>
{
public Solution2()
{
this.CollectionChanged += new NotifyCollectionChangedEventHandler(ObsCol_CollectionChanged);
}
...
}
Печать события
public class Solution3<T> : ObservableCollection<T>
{
public sealed override event NotifyCollectionChangedEventHandler CollectionChanged
{
add { base.CollectionChanged += value; }
remove { base.CollectionChanged -= value; }
}
...
}
То, что вы делаете, зависит от вашего варианта использования ... первое решение наиболее гибкое, поскольку вы все равно можете создавать подклассы со всеми видами переопределений.
С учетом SerializableAttribute
в вашем вопросе, возможно, стоит запечатать весь класс, так как вы, вероятно, все равно не хотите сериализовать подтипы (Решение 2).
Если вы когда-либо оказались в ситуации, когда метод OnEvent
/ RaiseEvent
по какой-либо причине недоступен, Решение 3 позволяет запечатать только минимальное подмножество функций, которое используется в конструкторе.