C# についての私の理解では、そのメソッドが仮想としてマークされていない限り、サブクラスはメソッドの親の実装をオーバーライドできないということです。サブクラスが、virtual とマークされていない親メソッドと同じ名前のメソッドを宣言する場合、単にそのメソッドを非表示にします。そのため、メソッドが親型の参照から呼び出された場合、親メソッドが呼び出されます。サブクラス型の参照から呼び出され、サブクラス メソッドが呼び出されます。ただし、C# ライブラリで、この動作を妨げているように見える状況が見つかりました。
Collection<T>
メソッドを宣言しますpublic void Add(T item)
。このメソッドは仮想ではないため、サブクラスの実装でその動作をオーバーライドしないでください。ただし、次のテストでは矛盾した結果が得られます。
public void Test()
{
ObservableCollection<String> strings1 = new ObservableCollection<String>();
strings1.CollectionChanged += OnCollectionChanged;
strings1.Add("One String");
Collection<String> strings2 = strings1;
strings2.Add("Another String");
}
public void OnCollectionChanged(Object source,
NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("Collection Change!");
}
動作はクラスにNotifyCollectionChanged
実装されておらず、クラスはクラスのメソッドをオーバーライドできないため、コレクション変更イベントは、オブジェクトが として参照されたときではなく、として参照されたときにのみ発生すると予想されます。ただし、2 つのイベントが発生します。結果は次のとおりです。Collection
ObservableCollection
Add
Collection
ObservableCollection<String>
Collection<String>
Collection Change!
Collection Change!
ここで何が起こっているのか誰でも説明できますか?