1

我想知道将下面的两个类结合起来的最佳方法是什么(在 C# 中)(这样我可以选择指定类型或不指定类型,以防不需要)?另外,如果需要,建议使用什么方法对 MyClass 进行编码以接受更多参数?谢谢!

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?
}

这样我就可以使用任何一个来处理 MyClass ......

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

2 回答 2

3

这样我就可以选择指定类型或不指定类型,以防不需要

只需合并它们并创建两个构造函数:

class MyClass<T> {

    T myvariable;

    public MyClass(){

    }

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

如果您不需要泛型类型,请使用Void( not void ):

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...>.

于 2012-07-06T07:00:21.167 回答
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);

(前提是您启用了自动装箱)。

于 2012-07-06T07:23:04.603 回答