2011-08-22 33 views
2

我寫了一個非常簡單的類,採用通用參數,比如T。現在,我要強制執行T只能是我的自定義類型ClassAClassBClassC之一,所以,我不能誤用毫無意義的類型使用它像intlong甚至其他類我寫的。我認爲這樣做的方法是讓這三個類在泛型類定義中實現相同的空ISomething接口並使用where T : ISomething。但是,我不知道這種方法(實現一個空接口)是否有意義。有沒有更好的方法來做到這一點?如何最好地實施泛型約束條件?

+0

爲什麼要強制執行,只有你的類型可以,如果泛型類不能與類型做任何使用?聽起來更像是你想在使用泛型類的類中強制使用類型。 – jgauffin

+0

這些課程不分享某些元素的曝光嗎?如果不是,它與泛型類有什麼關係?有什麼區別它們的?目前你的方法聽起來很不理想,但沒有足夠的信息爲你提供關於你應該做什麼的細節。 –

+0

有什麼關於'ClassA'等,使它們在這個泛型類中使用有意義? – AakashM

回答

2

這是行不通的。由於T類型爲ISomething,因此您只能訪問泛型類中的ISomething成員。由於ISomething只是一個沒有任何成員的標記接口,所以它對你沒有用處。
如果您的類共享通用功能,請將此共享功能添加到界面中。如果他們不這樣做,他們不應該實現相同的界面,你應該問自己你的設計是否正確。
請舉一個更具體的例子,也許我們可以給出更多實用的提示。

1

它取決於你想要添加什麼類型的約束以及你的類所做的操作類型。

一般來說,你應該添加約束爲您的泛型類使用

泛型類下面的例子中的類型使用方法GetString的(),這是在基類中實現的。您需要在該類型添加約束,以確保通用類會發現方法

class A 
    { 
     public string GetString() 
     { 
      return "A"; 
     } 
    } 

    class B : A 
    { 
     public string GetAnotherString() 
     { 
      return "B"; 
     } 
    } 

    class GenericClass<T> where T:A 
    { 
     private T _obj; 

     public GenericClass(T obj) 
     { 
      _obj = obj; 
     } 

     public string GetString() 
     { 
      return _obj.GetString(); 
     } 
    } 

    public class MyClass 
    { 
     public static void Main() 
     { 
      GenericClass<A> genericClass=new GenericClass<A>(new B()); 
      Console.WriteLine(genericClass.GetString()); 
      Console.Read(); 
     } 
    }