2010-07-25 26 views
6

Khi đọc về mẫu thiết kế Observer, tôi nhận thấy rằng nó được thực hiện bằng cách sử dụng giao diện. Trong Java, việc thực thi java.util.observable cũng là một lớp. Các phiên bản C# và Java có nên sử dụng giao diện không?Tại sao .NET ObservableCollection <T> được triển khai dưới dạng lớp chứ không phải giao diện?

Scott

+1

Làm cách nào để "triển khai dưới dạng giao diện"? Nếu một cái gì đó đã được thực hiện, nó là một lớp, phải không? Giao diện không được triển khai theo cách riêng của nó. – Kobi

+0

Tuy nhiên, ý nghĩa của câu hỏi là viết tắt. Có một khoảng trống lớn trong biểu đồ đối tượng bộ sưu tập .net với ObservableCollection . Chức năng của nó nên được tách ra thành các giao diện khác nhau để cho phép mở rộng theo cách linh hoạt hơn. Ví dụ: nếu tôi triển khai ObservableDictionary : INotifyCollectionChanged, tôi không thể sử dụng nó làm nguồn cho ReadOnlyObservableCollection . Việc triển khai hiện tại không dựa trên mẫu và không hỗ trợ phát triển dựa trên mẫu. –

Trả lời

8

Vâng, nó triển khai INotifyCollectionChangedINotifyPropertyChanged. Tuy nhiên, thú vị, nó không triển khai giao diện IObservable<T> mới từ .NET 4.0, mà bạn có thể đã mong đợi.

Nó có thể được cho là hữu ích để có một hình thức chung của INotifyCollectionChanged ... nhưng tôi không biết một.

+0

Vì vậy, tôi thực sự đã thử điều này, và nó kết thúc là thực sự xấu xí nếu bạn làm điều đó trực tiếp từ bất kỳ lớp nào thực hiện cả hai IObservable và IEnumerable có được * cả * Rx và LINQ mở rộng - rất nhiều đúc và gnashing răng. Tuy nhiên, bạn có thể thực hiện AsObservable() như một phương thức mở rộng khá dễ dàng –

2

Nhưng chúng KHÔNG sử dụng giao diện. ObservableCollection trong .NET là một triển khai thực hiện các giao diện - bạn được tự do bỏ qua nó và thực hiện riêng của bạn.

Các vấn đề liên quan