如何保护接口实现?

时间:2015-10-29 12:52:16

标签: c# .net interface

我刚刚在.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框架似乎如何做到这一点的问题(显然它不能)

2 个答案:

答案 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方法的原因, 事件,通过接口公开的属性