我刚刚在.NET框架(v4.0)中遇到过一件我无法理解的事情:
有班级SortDescriptionCollection
namespace System.ComponentModel
{
public class SortDescriptionCollection : Collection<SortDescription>, INotifyCollectionChanged
{
....
protected event NotifyCollectionChangedEventHandler CollectionChanged;
....
}
}
实施界面INotifyCollectionChanged
:
public interface INotifyCollectionChanged
{
event NotifyCollectionChangedEventHandler CollectionChanged;
}
我想在课堂上使用这个活动,但我不能,因为它受到了保护。
这不是大问题,因为我可以将实现转换为接口然后使用它。
但是如何建造呢?如果我尝试用
class MyDerivedType : INotifyCollectionChanged
{
protected event NotifyCollectionChangedEventHandler CollectionChanged;
}
所以编译器说:
'MyDerivedType'未实现接口成员 'System.Collections.Specialized.INotifyCollectionChanged.CollectionChanged'。 'MyDerivedType'无法实现接口成员,因为它不公开。
修改 我不认为这是重复的。我没有要求如何编译上面的代码,这是.NET框架似乎如何做到这一点的问题(显然它不能)
答案 0 :(得分:3)
这是一个明确实现的接口事件:
event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged
{
add { CollectionChanged += value; }
remove { CollectionChanged -= value; }
}
所以它满足INotifyCollectionChanged
的要求,但它在课堂上并不公开 - 完全有效。
这通常表示意图 - 这不应该是类的公共接口的一部分。但是,如果你绝对想从外部访问它,你可以只对界面进行强制转换:
((INotifyCollectionChanged)myCollection).CollectionChanged
答案 1 :(得分:0)
看看,想象一下你实现了界面:
SortDescriptionCollection my = new SortDescriptionCollection();
// you can't do this (it should not compile)
// since "CollectionChanged" is protected
my.CollectionChanged += (sender, e) => Console.Write("hello from event!");
// however, since SortDescriptionCollection implements SortDescriptionCollection
// you can cast to the interface
INotifyCollectionChanged hack = my as SortDescriptionCollection;
// wow! you can access "protected" event as if it's public one!
// So isolation is violated
hack.CollectionChanged += (sender, e) => Console.Write("hello from hacked event!");
因此,隔离违规是您无法使用protected
方法的原因,
事件,通过接口公开的属性