2009-12-20 7 views
0

저는 Silverlight에서 프로젝트 작업을하고 ObservableCollection이 어떻게 작동하는지 알고 싶었습니다.반사 된 코드에서 동일한 이름을 가진 이벤트?

public class ObservableCollection<T> : 
      Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged 
{ 
    // Fields 
    private bool _busy; 

    // Events 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    protected event PropertyChangedEventHandler PropertyChanged; 

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged; 
... 

가 어떻게이 같은 이름을 가진 두 이벤트를하고 입력 할 수 있습니다 :이 반사판에보고 매우 놀랐습니다? 무슨 일이야? 리플렉터의 버그입니까?

답변

2

아니요, 이것은 explicit interface implementation입니다. 이 줄은 :

protected event PropertyChangedEventHandler PropertyChanged; 

공개되지 않았기 때문에 INotifyPropertyChanged 계약을 구현할 수 없습니다. 다른 클래스는이를 참조 할 수 없으므로 ObservableCollection은 자신이 말하는 인터페이스를 구현하는 것처럼 클라이언트를 보지 않습니다. 예 :

ObservableCollection<string> coll; 
// ObservableCollection implements INotifyPropertyChanged, so I should be able to... 
coll.PropertyChanged += ... 
// ... but this wouldn't compile because PropertyChanged is protected 

는 ObservableCollection에는 에서 INotifyPropertyChanged 인터페이스에 "범위"입니다하여 PropertyChanged의 다른 구현을 추가하고,이 문제를 얻으려면. 즉, 클라이언트가 INotifyPropertyChanged 유형의 참조를 통해 ObservableCollection에 액세스하는 경우에만 사용할 수 있습니다.이 경우 효과적으로 공개됩니다. 그래서 지금 그들이 찾고있는 이벤트가 있기 때문에, ObservableCollection에가에서 INotifyPropertyChanged가 행복 할 것이다 구현한다는 사실을 사용하고자하는 고객 :

INotifyPropertyChanged notifier = coll; 
notifier.PropertyChanged += ... // compiles (using explicit implementation) 

그러나 추가하여 PropertyChanged이 같은으로 보호 된 멤버와 충돌하지 않는 이는 INotifyPropertyChanged.이라는 접두어로 범위가 지정되었으므로

0

명시 적 선언이라고합니다. 제네릭 컬렉션에 두 개의 GetEnumerator() 메서드가있을 수있는 것과 같은 방식입니다. 하나는 공개로 선언됩니다. 다른 하나는 명시 적으로 선언됩니다.