Использование интерфейса в качестве параметра конструктора в Java? - PullRequest
0 голосов
/ 07 апреля 2010

Как бы я смог выполнить следующее:

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

Чтобы я мог объявить

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

Где class1 и class2 также являются классами, которые реализуют интерфейс.

Кроме того, как только я выполню это, как я смогу ссылаться на каждый отдельный параметр, который будет использоваться в testClass?

Спасибо:)

Ответы [ 4 ]

8 голосов
/ 07 апреля 2010

Чтобы я мог объявить

Интерфейс testObject = new testClass (новый класс1 (4), новый class2 (5));

Вам нужно использовать varargs в конструкторе testClass:

public testClass (Interface ... args) {
   for (Interface i : args) {
      doSmthWithInterface (i);
   }
}
4 голосов
/ 07 апреля 2010

Вы можете использовать переменные, которые рассматриваются как массивы. Например:

public testClass(Interface... args) {
    System.out.println(args[0]);
}
0 голосов
/ 07 апреля 2010

Вам не нужно использовать 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

0 голосов
/ 07 апреля 2010

Как это (сохранить весь образец в файл, скажем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...