首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么.NET ObservableCollection <T>实现为类而不是接口?

在这个问答内容中,我们讨论了为什么.NET ObservableCollection <T>实现为类而不是接口。

首先,我们需要了解ObservableCollection <T>的作用。ObservableCollection <T>是一个集合类,它实现了INotifyCollectionChanged接口,这使得当集合发生更改时,它可以通知任何订阅者。这是一个非常有用的功能,特别是在MVVM模式中,当集合中的数据发生变化时,我们需要自动更新UI。

现在,我们来回答为什么ObservableCollection <T>实现为类而不是接口。

原因在于,如果ObservableCollection <T>仅仅是一个接口,那么它将无法提供实现。接口只定义了一个类应该遵循的规则和约定,但它本身不提供任何实现。为了实现INotifyCollectionChanged接口,我们需要编写一些代码来处理集合更改事件,并通知任何订阅者。这些代码需要放在某个地方,而类正是提供了这样一个容器。

此外,如果ObservableCollection <T>是一个接口,那么任何实现它的类都必须实现所有的方法和属性。这可能会导致一些问题,因为并不是所有的集合类都需要实现所有的方法和属性。例如,一些集合类可能只需要实现Add和Remove方法,而不需要实现其他方法。

因此,将ObservableCollection <T>实现为类而不是接口是一个更好的选择。这样,我们可以在类中提供默认实现,同时也可以让其他类继承或组合这个类,以实现自己的需求。

总之,将ObservableCollection <T>实现为类而不是接口是一个明智的选择,因为这样可以提供默认实现,同时也可以允许其他类根据需要进行扩展和组合。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

win10 uwp 通知列表

在 C# 很少直接使用数组,因为数组难以指定类型,需要指定类型的,一般都会使用 List 。 List 我就叫他列表,继承 ICollection 的,一般就可以叫列表。...当然如果列表使用的的属性有通知,对他进行修改,还是可以看到界面修改。 如果希望对列表修改时,界面也变化,那么简单方法是使用 ObservableCollection。...首先在给 Source 值的时候,会自动判断是不是有 INotifyCollectionChanged ,如果是的话,自动监听。...那么 ObservableCollection 缺少了很多东西,如添加多个元素,需要每次都进行 遍历,是不是可以自己写一个和 ObservableCollection 差不多的?...代码:http://download.csdn.net/detail/lindexi_gd/9826807 ?

60720

win10 uwp 通知列表

在 C# 很少直接使用数组,因为数组难以指定类型,需要指定类型的,一般都会使用 List 。 List 我就叫他列表,继承 ICollection 的,一般就可以叫列表。...当然如果列表使用的的属性有通知,对他进行修改,还是可以看到界面修改。 如果希望对列表修改时,界面也变化,那么简单方法是使用 ObservableCollection。...首先在给 Source 值的时候,会自动判断是不是有 INotifyCollectionChanged ,如果是的话,自动监听。...那么 ObservableCollection 缺少了很多东西,如添加多个元素,需要每次都进行 遍历,是不是可以自己写一个和 ObservableCollection 差不多的?...代码:http://download.csdn.net/detail/lindexi_gd/9826807 ?

62110

WPF Binding学习(四) 绑定各种数据源

ListView是ListBox的派生GridView是ViewBase的派生,ListView中的View是一个ViewBase对象,所以,GridView可以做为ListView的View来使用不能当作独立的控件来使用...接下来看一下ObservableCollection这个集合,我们可以看到在这里使用的是ObservableCollection集合并非平常的List集合,那么为什么呢,因为ObservableCollection...集合实现了INotifyCollectionChanged接口,也就是可以双向绑定。...Framework开始支持LINQ,使用LINQ,可以方便的操作集合对象,LINQ查询结果是一个IEnumerable类型对象,IEnumerable又派生自IEnumerable,所以可以作为列表控件的...所以选中的是StackPanel2 不是Grid2 。最后将RelativeSource对象设置为Binding的数据源 注意:设置数据源使用的是RelativeSource不是Source

4.2K30

WPF NET5 Prism8.0的升级指南

前言 ​ 曾经我以学习的目的写了关于在.NET Core3.1使用Prism的系列文章.NET Core 3 WPF MVVM框架 Prism系列文章索引,也谢谢大家的支持,事实上当初的版本则是Prism7.2.0.1442...(7.2)版本,现在也发布了.NET5和最新的Prism8.0.0.1909(8.0)版本,因此同样的我想将之前的Prism Demo项目可以升级到最新,写这篇文章的目的是自己也能学习一番,更多的是回答那些在我...Prism系列文章下面留下的我认为可以拿来一讲一些问题,而有些问题我则是水平有限回答不了(真的不是不想回答)  然后我拿之前的Prism Demo项目,WPF从.NET Core3.1升级到.NET...//替换为 ServiceLocator.Current.GetInstance  这可能是你遇到的第一个升级报错,因为ContainerLocator.Current.Resolve这个... _allMedicines=new ObservableCollection(); public ObservableCollection<Medicine

2.7K40

C# API中的模型和它们的接口设计

它返回的是IEnumerable不是IEnumerable,这让它看起来就像是一个C# 1的接口不是泛型。...INotifyCollectionChanged最著名的实现是ObservableCollection。这个旨在为每个添加或删除的项目触发一个单独的CollectionChanged事件。...只需使用ObservableCollection或ReadOnlyObservableCollection作为基,然后在其上添加所需的任何附加特性。...变更跟踪和撤消 虽然使用不是很频繁,.NET还是提供了专门用于跟踪对象变更的接口,这些接口甚至还提供了撤消功能。...但在涉及集合属性时,这可能有点蹊跷,最好是将其封装在中,不是尝试构建临时解决方案。 可编辑的对象 与IChangeTracking不同,IEditableObject专门用于UI场景中。

1.6K20

WPF 多线程下跨线程处理 ObservableCollection 数据

大部分微软出品的库和框架都是十分照顾到初学者的,因此默认只开单线程模型的 WPF 框架,将在开发者没有经过 Dispatcher 调度器直接或间接访问或修改 UI 时,抛出异常 理解了以上这一点,也就了解了为什么跨线程处理... 非 UI 线程访问 UI 元素是限制只有 UI 线程才能合法访问 UI 线程创建的元素。...列表的能力,必须从业务上确保只有后台线程在访问, UI 线程不会对 ObservableCollection 列表进行任何的改动 在确保 UI 线程不会改动到 ObservableCollection...在 WPF 里面,只要一个集合类型的对象继承了 INotifyCollectionChanged 接口,即可在集合变更的时候,通过 WPF 框架监听 CollectionChanged 事件重新更新 UI...元素,自己实现的代码大概如下 public class FooList : Collection, INotifyCollectionChanged { protected override

2.9K10

关于我的知识盲区之ItemsSource的分享~

下面有一个例子,我们可以看到,初始化界面的时候,数据绑定了一次(mygard.ItemsSource),当点击按钮的时候,itemsource的值就发生改变了,这个是为什么呢?...其实呢,最最主要的还是因为这个 ObservableCollection 定义 命名空间:System.Collections.ObjectModel程序集:System.dll 表示一个动态数据集合...可以枚举实现 IEnumerable 接口的任何集合。 但是,若要设置动态绑定,以便集合中的插入或删除操作自动更新 UI,则集合必须实现 INotifyCollectionChanged 接口。...WPF 提供 ObservableCollection ,该类是实现 INotifyCollectionChanged 接口的数据集合的内置实现。...在实现自己的集合之前,请考虑使用 ObservableCollection 或某个现有的集合,如 List、Collection和 BindingList,等等。

1.1K20

【我们一起写框架】MVVM的WPF框架(四)—DataGrid

为什么明知道违背设计逻辑,还要这样编写框架呢? 那是因为,我们编写的是框架,是使用MVVM的概念编写框架,不是要完美的实现MVVM设计。 两者有什么区别呢?区别就是前者是实战,后者只是个理念。...在实战架构中,并不是UI的东西都一定要放在UI层写,逻辑的东西放在逻辑层写的。因为,架构的目的是让程序员更好的写代码,不是让代码死死的固定在某一层。...因为,架构师是设计模式的使用者,不是被使用者。...事实上,代码界也一样,总是会那不守规矩的程序员触犯法律,他们会让代码跨边界引用库,或者拒绝使用接口声明对象等等。 为什么不能准守规则呢?... _ItemsSource = new ObservableCollection(); public ObservableCollection ItemsSource

1.1K20

Freezable ---探索Freezable承载数据的原理

引言 在之前写的一篇文章【WPF --- 如何以Binding方式隐藏DataGrid列】中,我先探索了 DataGridTextColumn 为什么不在可视化树结构内?...,建议先阅读我的另一篇文章【编程技巧 --- VS如何调试.Net源码】,学习如何调试源码。...接下来看看为什么当 IsVisibility 变化时,能通知到 Freezable? NotifySubPropertyChange(...) FireChanged(...)...该类是更好地管理和优化 WPF 应用程序中的对象和资源的,所以可能不想让开发者随意使用吧,所以就仅提供该类能够拥有 InheritanceContext 没法使用 DependencyObject 。...小结 Freezable 除了上文示例中的用法,其实它这种间接绑定的方式可以解决很多场景,比如某个元素的属性并不是依赖属性,但是你就是想使用 Binding 的方式,让它动态变化,也可以使用上文示例的方式进行绑定

13810

30分钟泛型教程

库还提供了很多的泛型类型,在这里就不一一例举了 五、泛型的继承: 在.net中一切都继承自Object 泛型也不例外 泛型类型可以继承自其他类型 来看一下如下代码 public class MyType...(T).ToString() + " from MyThirdType"; } } 此中诀窍,只可意会,不可言传 六、泛型接口 .NET库里有很多泛型的接口 比如:IEnumerator...、IList等 这里不对这些接口做详细描述了 值说说为什么要有泛型接口。...同时,也不是强类型的,不能在编译期确定参数的类型 有了IComparable就解决掉这个问题了 int CompareTo(T other); 七、泛型委托 委托描述方法, 泛型委托的由来和泛型接口类似...如果你没有对T进行struct约束,也没有对T进行new约束 那么你不能写这样的代码:T obj = new T();  这无法通过编译,因为值类型肯定有无参数构造器,引用类型就不一定了。

68260

快速入门系列--CLR--03泛型集合

.NET中的泛型集合 在这里主要介绍常见的泛型集合,很多时候其并发时的线程安全性常常令我们担忧。因而简述下.NET并发时线程安全特性,其详情请见MSDN。...普通集合都不支持多重并发写操作 部分支持单线程写和并发读操作 同时.NET4添加了大量并发集合 首先介绍常见的泛型集合接口,其大部分都位于System.Collection.Generic...IEnumerable,其可以获取一个IEnumerator迭代器,如果从数据库的角度来看,前者是表,后者是游标,同时这两个接口是唯一具有可变性的集合接口。...Colletion,位于System.Colletion.ObjectModel命名空间,为BindingList和ObservableCollection等扩展类型提供基。...小节:在日常工作中,当遇到需要并发操作非集合类型的全局变量时,需要使用锁来处理;当是集合类型时,就需要使用对应的并行集合来处理,其能很好的TPL协作在一起。

71770
领券