2010-07-25 7 views
6

Nella lettura del modello di progettazione di Observer, ho notato che è implementato usando le interfacce. In Java, l'implementazione java.util.observable è anche una classe. Le versioni C# e Java non dovrebbero usare le interfacce?Perché .NET ObservableCollection <T> implementato come classe e non come interfaccia?

Scott

+1

Come si può "implementare come interfaccia"? Se qualcosa è già implementato, è una classe, non è vero? Un'interfaccia non è implementata da sola. – Kobi

+0

Tuttavia, il significato della domanda è valido. C'è un enorme vuoto nel grafico dell'oggetto .net con ObservableCollection . La sua funzionalità avrebbe dovuto essere separata in diverse interfacce al fine di consentire l'estensibilità in un modo più flessibile. Ad esempio, se implemento un ObservableDictionary : INotifyCollectionChanged, non posso utilizzarlo come origine per ReadOnlyObservableCollection . L'implementazione attuale non è basata su modelli e non supporta affatto lo sviluppo basato su modelli. –

risposta

8

Bene, implementa INotifyCollectionChanged e INotifyPropertyChanged. Tuttavia, interessante, lo non implementa la nuova interfaccia IObservable<T> da .NET 4.0, che potreste aspettarvi.

Sarebbe probabilmente utile che ci sia un modulo generico di INotifyCollectionChanged ... ma non ne conosco uno.

+0

Quindi, in realtà ho provato questo, e finisce per essere davvero brutto se lo fai direttamente dal momento che qualsiasi classe che implementa sia IObservable e IEnumerable ottenere * sia * Rx e Linq estensioni - un sacco di casting e digrignare di denti. Tuttavia, è possibile implementare AsObservable() come metodo di estensione abbastanza facilmente –

2

Ma loro usano le interfacce. ObservableCollection in .NET è un'implementazione delle interfacce: sei libero di ignorarlo e alla tua implementazione.

Problemi correlati