執行面向對象設計時,將使用簡單值類型的方法集合合併爲一個通用方法會更好嗎?例如:應該將具有值類型的重載方法合併爲一個通用方法嗎?
public int Sum(int x, int y)
// Overload with float.
public float Sum(float x, float y)
合併到:
public T Sum<T> (T x, T y)
感謝,
斯科特
執行面向對象設計時,將使用簡單值類型的方法集合合併爲一個通用方法會更好嗎?例如:應該將具有值類型的重載方法合併爲一個通用方法嗎?
public int Sum(int x, int y)
// Overload with float.
public float Sum(float x, float y)
合併到:
public T Sum<T> (T x, T y)
感謝,
斯科特
一般來說是的,但是,特別是與你的榜樣(求和兩個參數) - 你可以」不要使用泛型,因爲+
運算符不是任何可以約束泛型類型參數的接口的一部分:)
(注:這是我的C#的部分談話,在其他語言中可能仍然是可能的)
在一些案件,有(不總是);儘管有相反的傳言,但這是可能的。我爲"MiscUtil"(免費等)編寫了一些代碼,完全是這個,它適用於所有類型與合適的運營商(甚至你自己的結構和類,或Nullable<T>
等)。
這裏的問題是,沒有接口支持Add
等,所以直到dynamic
出現(在4.0)這是很棘手的做;但它可以做到的 - 這裏的usage page,具有simiplfied Sum
(實際在「MiscUtil」代碼稍微複雜一些):
public static T Sum<T>(this IEnumerable<T> source)
{
T sum = Operator<T>.Zero;
foreach (T value in source)
{
if (value != null)
{
sum = Operator.Add(sum, value);
}
}
return sum;
}
再次,很多這是相對簡單的在4.0 dynamic
,因爲這支持運營商;然而,上次我以此爲基準,dynamic
比我的(ab)使用Expression
慢。
順便說一句,該標準LINQ 可以提供Min
/Max
的原因是因爲IComparable
/IComparable<T>
,通過Comparer<T>.Default
協助。
感謝您的回答!這是不是可以做到這一點,或者這是一個糟糕的設計決定?我正在考慮它現在寫入的方式,兩個參數都是不受限制的,所以有人可以傳入任何對象,並且+操作對於所有類型都不會重載,因此會中斷。這聽起來正確嗎? – 2009-12-31 21:21:16
是的,CLR的一個缺失部分 - 是一個INumeric接口,它將包含那些運算符(應用於實現它們的所有核心類型 - int,uint,float,decimal等) – 2009-12-31 21:21:19
@Scott Davies - No ,這是不可能的(讀 - 編譯錯誤),編譯器不知道如何將調用轉換爲'+'以獲得不受約束的類型。如果類型不受約束,則任何方法都是如此,而不僅僅是「+」。 – 2009-12-31 21:22:26