2017-06-15 134 views
2

我正在嘗試在實現屬於彼此的對象之間建立一個類型層次結構。語法已經變得多餘,導致我相信我要麼濫用泛型,要麼有巧妙的手段來表示接口之間的這種關係。與泛型建立關係

讓我給你舉個例子:

interface Interface 
{ } 
interface Class<I> 
    where I : Interface 
{ } 
interface Method<I, C> 
    where I : Interface 
    where C : Class<I> 
{ } 
interface Parameter<I, C, M> 
    where I : Interface 
    where C : Class<I> 
    where M : Method<I, C> 
{ } 

}

這個層次的根是Interface。然後,我們有一個Class,它只能從一個特定的Interface派生。

Method必須屬於Class的特定實現。

Parameter只能用特定的Method執行。

有沒有更好的方法來解決這個問題?我用C#泛型語法生疏一點,因爲過去一年我一直在C和Go游泳。

+3

這真的取決於你想如何使用這個。現在你的問題似乎有點泛泛,沒有雙關意圖。 – juharr

回答

8

聽起來好像你正試圖在類型系統中捕獲業務域的業務規則 - 接口和類以及方法和參數。

我建議你不要試圖做到這一點。它往往會導致痛苦,因爲類型系統的規則不一定完全映射到您的業務領域的規則。

特別是:商業領域通常有很多形式的規則「一個X是一種被限制在Z上的Y」,而這在使用Liskov替換原則的類型系統中很難表示:如果Y是一種X,而X可以做Z,那麼Y可以用在需要Z-doer的上下文中。泛型被設計用於解決容器,比較器,一元類型(如可爲空,序列,未來,懶惰等)和其他類型結構的問題。我的經驗法則:如果你不能在你的描述中使用「of」這個詞,或者寫一個簡單的形容詞,那麼不要使用泛型。 「一碗蘋果,一碗橘子,好吧,聽起來像碗一般。數字的順序,名字的順序,當然,可以爲空的日期,懶惰的字符串。」所有這些都很好,很容易。接口類?不太清楚。

更多的想法在這裏:

https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/

+0

你完全正確。所以答案是,是的,我濫用泛型!這個想法源於使用Unity等IoC框架來替代專有系統實現的不同部分。但是,您認爲在某個時候架構試圖通過泛型來捕獲業務邏輯是正確的,泛型是濫用開始的地方。 –