2012-07-06 86 views
1

我想知道什么是最好的方式(在C#中)结合我的两个类下面(这样我可以选择要么指定一个类型或不,没有必要)?如果需要,还有什么可以将MyClass编码为更多参数的推荐方法?谢谢!在C中有零个或多个参数的泛型构造函数#

public class MyClass{ 

    public MyClass() {} 
} 

public class MyClass<T> { 

    T myvariable; 

    public MyClass<T>(T arg){  
     myvariable = arg; 
    } 

    // how can I handle MyClass(arg1, arg2, ....? 
    // would I need to create classes MyClass<T,U,...> for each number of argument? 
} 

,这样我可以delcare MyClass的有要么...

MyClass my1 = new MyClass() 
MyClass<string> my2 = new MyClass("test"); 

回答

3

,这样我可以选择到指定类型与否,在情况下,当一个没有必要

只是把它们合并,并创建两个构造函数:

class MyClass<T> { 

    T myvariable; 

    public MyClass(){ 

    } 

    public MyClass(T arg){ 
     myvariable = arg; 
    } 
} 

如果你并不需要一个泛型类型,使用Voidvoid):

public static void main(String[] args) { 
    final MyClass<Void> my1 = new MyClass<Void>(); 
    final MyClass<String> my2 = new MyClass<String>("Test"); 
} 

编码MyClass的在必要时采取更多的参数

如果您需要变量数量相同的参数T,使用可变参数:

class MyClass<T> { 

    T[] myvariable; 

    public MyClass(){ 

    } 

    public MyClass(T... arg){ 
     myvariable = arg; 
    } 

} 

无法声明可变数量的异构类型,如<T, U, V...>

+0

有没有办法避免强迫用户键入,就像它可以被排除在外?你会有多个参数的建议吗?谢谢回复! – user1229895 2012-07-06 07:02:04

+0

@ user1229895:如果您只是使用'new MyClass()',它会隐式使用'Object'作为'T'。另请参阅我的更新wrt多个参数。 – 2012-07-06 07:04:39

+0

谢谢,我看到我必须使用参数保存它(顺便说一句,我认为你写的签名中缺少的?)。非常感谢! – user1229895 2012-07-06 07:09:35

1

您可以实现静态工厂方法以避免明确指定类型,例如然后

public static MyClass<Void> create() { 
    return new MyClass<Void>() 
} 

public static <T> MyClass<T> create(T type) { 
    return new MyClass<T>(type); 
} 

客户端可以创建新实例,像这样:

MyClass<Void> noType = MyClass.create(); 
MyClass<String> withType = MyClass.create("some type"); 
MyClass<Integer> withInt = MyClass.create(123); 

(前提是你已经启用了自动装箱)。

+0

感谢Erich,我是否正确地说“工厂”只调用泛型构造函数并返回实例? – user1229895 2012-07-06 07:32:10