2011-08-22 59 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(); 
     } 
    }