2015-11-05 39 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是的,但你爲什麼要爲那些接口哈哈。他們只是機場上的物業。 –