2015-11-05 67 views
0

我想学习/理解的Rx,特别RxJS,并不断看到引用的IObservable,IObserver等IObservable中的'I'<T>或IObserver <T>是什么意思?

谁能告诉我是什么导致I手段和/或它从何而来?

从我的搜索,它看起来像<T>是为类型。如果这是错误的或天真的,我会很感激这方面的澄清。

谢谢!

+1

接口。命名约定来自.net,其中纯抽象类在称为Interface的框架中有一个特殊的构造。 Javascript是一种鸭子打字的语言,没有这样的东西。然而,你仍然有一个抽象的合同概念,你期望履行。 – Aron

+1

.net没有发明接口,命名约定很常见。尽管同意其余的。 –

回答

4

在你们MFC的C++的昔日,微软不得不匈牙利命名法到非常刺激性的艺术形式,所有具体的类都带有前缀CI他们的COM接口,这确实有助于避免冲突,其中一个COM接口和班级可能会共用同一个名字,并且会让您的项目变得浑浊。

这个表示法的一部分被转移到.NET中,除了接口保留前缀​​I,但类和其他类型删除了它们的C s。这确实使得非界面繁重的代码更易于查看,但是如果您开始使用以字母I开头的2个字母的缩写名称(因为根据.NET样式必须完全大写两个字母的首字母缩写词)准则),但这很少见。 (我注意到通用类型名称占位符的前缀也是T,例如,TKeyTValueDictionary中)。

为什么需要这样做的一个例子是在.NET中处理集合时,如果构建可重用的库并且不想公开实现细节(例如,如果使用List<T>T[]作为底层收集字段类型),您可以使用接口为IList<T>IReadOnlyList<T>。如果该接口简单地称为List<T>,它将与实际类型List<T>冲突,并且ReadOnlyList<T>(接口)可能与ReadOnlyCollection<T>(一个类)相混淆。

您可能会争辩说,如果类和接口有不同的名称空间,这不会成为问题。 C是这样做的:struct类型和标量存在于不同的名称空间中,不幸意味着每次使用struct类型名称时,其用法必须以struct(例如声明:struct Foo foo)作为前缀。人们通过使用带有匿名结构的typedef来解决这个问题,但我觉得最终结果很混乱(而且Linux内核编码准则也禁止这样做)。

但是,在Java中,接口没有以I作为前缀,而是具有类名称。无论这是“正确的”还是“更好的”完全是为了辩论。 C++没有接口类型,只有纯粹的抽象类和多重继承,所以在COM之外通常不会看到前缀I

+0

我希望我能再次为第一句话重新投票。这最后坚持匈牙利符号强制社区作为供应商的公约,激怒了我不尽结束:) – David

+0

尝试创建与IATA或国际民航组织相关的接口:) –

+0

@PanagiotisKanavos是的,但你为什么要为那些接口哈哈。他们只是机场上的物业。 –