2012-03-08 118 views
1

我剛開始探索使用泛型的基本原理,並曾想過我可以實現這種簡單模式來解決我日常使用中的典型問題。我花了幾天時間尋找一個簡單的例子。我可以找到尋找.Equals的例子,但沒有太多過去。我希望能夠用之類的實例:如何在C#中實現一個簡單的通用比較#

Spec<double> voltageSpec; 
Spec<int> cyclesSpec; 
Spec<myClass> fishInTheOceanSpec; 

然後能夠:

bool isGood = voltageSpec.inSpec(5.0); 
bool isGood cyclesSpec.inSpec(2); 
bool isGood fishInTheOceanSpec.(new myClass(20)); 

我嘗試如下所示。

/// <summary> 
/// Generic object to hold a specification i.e min and max limits. 
/// Implements a method to determin if a value is between limits. 
/// </summary> 
public class Spec<T> : IComparer<T> 
{ 
    public Spec() 
    { 
     Min = default(T); 
     Max = default(T); 
    } 
    public T Min { get; set; } 
    public T Max { get; set; } 
    public bool inSpec(T Value) 
    { 
     if ((Comparer<T>.Default.Compare(Value, this.Max) <= 0) & 
      (Comparer<T>.Default.Compare(Value, this.Min) >= 0)) 
      return true; 
     else 
      return false; 
    } 

    public int Compare(T x, T y) 
    { 
     if (x == y) return 0; 
     if (x < y) return -1; 
     if (x > y) return 1; 
    } 

    public Spec<T> Copy() 
    { 
     return (Spec<T>)this.MemberwiseClone(); 
    } 
} 
+0

你可能彪&&在比較的一部分類。 – 2012-03-08 20:31:17

+0

@EK,考慮使用完整的單詞作爲類名稱,即名稱範圍類Range而不是Spec(這可能應該包括作爲成員的特定屬性的範圍)。 – 2012-03-08 21:21:31

回答

2

我會重構如下 - 讓T負責提供比較 - 這個工程已經基本類型,自定義類只需要實現IComparable<T>

public class Spec<T> where T : IComparable<T> 
{ 
    public Spec() 
    { 
     Min = default(T); 
     Max = default(T); 
    } 
    public T Min { get; set; } 
    public T Max { get; set; } 
    public bool inSpec(T Value) 
    { 
     if(Value.CompareTo(this.Max) <=0 && 
      Value.CompareTo(this.Min) >=0) 
      return true; 
     else 
      return false; 
    } 

    public Spec<T> Copy() 
    { 
     return (Spec<T>)this.MemberwiseClone(); 
    } 
} 
1

聲明你的類像這樣

public class Spec<T> : IComparer<T> 
    where T : IComparable<T> 
{ 
    .... 
} 

那麼你可以申請CompareToT

public int Compare(T x, T y) 
{ 
    return x.CompareTo(y); 
} 

基本類型,如intdoublestring國家執行IComparable<T>

相關問題