在Java中使用接口作为构造函数参数?

时间:2010-04-06 20:13:44

标签: java design-patterns interface constructor parameters

我如何能够完成以下任务:

public class testClass implements Interface {
     public testClass(Interface[] args) {
     }
}

所以我可以宣布

Interface testObject = new testClass(new class1(4), new class2(5));

其中class1和class2也是实现Interface的类。

另外,一旦我完成了这个,我怎样才能引用在testClass中使用的每个参数?

谢谢:)

4 个答案:

答案 0 :(得分:8)

  

所以我可以宣布

     

接口testObject = new   testClass(new class1(4),new   等级2(5));

您需要在testClass构造函数中使用varargs:

public testClass (Interface ... args) {
   for (Interface i : args) {
      doSmthWithInterface (i);
   }
}

答案 1 :(得分:4)

您可以使用被视为数组的varargs。例如:

public testClass(Interface... args) {
    System.out.println(args[0]);
}

答案 2 :(得分:0)

像这样(将整个样本保存到文件中,比如testClass.java):

interface Interface{}

public class testClass implements Interface 
{
     public testClass(Interface ... args) 
     {
        System.out.println("\nargs count = " + args.length);
        for( Interface i : args )
        {
            System.out.println( i.toString() );
        }
     }

     public static void main(String[] args)
     {
         new testClass(
          new Interface(){}, // has no toString() method, so it will print gibberish
          new Interface(){ public String toString(){return "I'm alive!"; } }, 
          new Interface(){ public String toString(){return "me, too"; } }
         );

         new testClass(); // the compiler will create a zero-length array as argument
     }
}

输出如下:

C:\temp>javac testClass.java

C:\temp>java testClass

args count = 3
testClass$1@1f6a7b9
I'm alive!
me, too

args count = 0

答案 3 :(得分:0)

你不必使用varargs,你可以使用数组作为输入参数,varargs基本上只是数组参数的一种奇特的新语法,但它将有助于防止你必须在数组中构造自己的数组打电话给你 即,varargs允许(parm1,parm2)被接收到数组结构中

您不能使用接口来强制构造函数,您应该使用具有所需构造函数的公共抽象超类。

public abstract class Supa {

    private Supa[] components = null;

    public Supa(Supa... args) {
        components = args;
    }

}
public class TestClass extends Supa {

    public TestClass(Supa... args) {
        super(args);
    }

    public static void main(String[] args) {
        Supa supa = new TestClass(new Class1(4), new Class2(5));
            // Class1 & Class2 similarly extend Supa
    }
}

另请参阅复合设计模式http://en.wikipedia.org/wiki/Composite_pattern