2014-10-28 3 views
0

У меня есть абстрактный суперкласс:Метод родового Создание экземпляра из суб-класса в Java

class abstract Father{ 
public static boolean controll(){here comes code....} 
} 

class child1 extends Father{ 
public static boolean controll(){ 
    does something.... 
    Father.controll(); 
}} 

В моем главном классе я инициируют детей, как этот

if(Child1.controll()){ new Child1().callingOtherMethod()} 
if(Child2.controll()){ new Child2().callingOtherMethod()} 

И так далее много раз .. ..

Я все еще очень новичок в дженериках и не совсем согласен с этим. Как я пишу в своем основном классе методом более общий характер, что делает что-то вроде этого:

public void moveToStep(Class<? extends Father> clasz){ 
    if(clasz.controll()) 
     new clasz().callingOtherMethod() } 

, так что я могу назвать его в краткой форме:

moveToStep(Child1.class); moveToStep(Child1.class); ... 

Может быть Im неправильно пытаться использовать родовой. Не уверен, что это правильный способ избежать этого повторения в основном классе

+0

Нужны ли вам методы статики? – afsantos

+0

Да, потому что я проверяю, нужно ли мне создавать объекты по заданным параметрам перед тем, как сделать экземпляр. Это избавит меня от ненужных объектов – user3170595

ответ

0

Прежде всего, включите метод, который вы хотите назвать абстрактным в суперклассе.

abstract class Father { 
    public static boolean predicate() { /*...*/ } 

    protected abstract void method(); 
} 

Затем убедитесь, что ваши подклассы содержат пустой конструктор.

final class Child1 extends Father { 
    Child1() { /*...*/ } 

    public static boolean predicate() { return true; } 

    @Override 
    public void method() { 
     System.out.println("Child1"); 
    } 
} 

Посмотрите в документации для Class и Method. Используйте рефлекс для вызова предиката (controll в вашем примере), а затем newInstance для создания экземпляра класса и вызова другого метода.

public static void main(String[] args) { 
    List<Class<? extends Father>> children = 
      Arrays.asList(Child1.class, Child2.class); 
    for (Class<? extends Father> c: children) { 
     try { 
      Method pred = c.getDeclaredMethod("predicate"); 
      Boolean b = (Boolean) pred.invoke(null); 
      if (b.booleanValue()) { 
       Father f = (Father) c.newInstance(); 
       f.method(); 
      } 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException | InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Спасибо! это сработало, и я многому научился. Спасибо – user3170595

+0

@ user3170595 Я рад, что смогу помочь. Не забудьте принять ответ, если любой из ответов, размещенных здесь, решает вашу проблему. – afsantos

0

Код, который вы ищете, находится в java.lang.reflect. Вы можете попробовать использовать

http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#newInstance--

Это будет работать только, если есть нулевой конструктор. В противном случае вам нужно будет найти конструктор, также используя отражение, чтобы выяснить, какие значения будут переданы ему.

+0

Я изменил его на: public void moveToStep (класс clasz) {try {if (clasz.controll()) clasz.getInstance(); ...)} Но программа не распознает clasz как тип Отца и не может найти метод controll() с уважением к clasz – user3170595

+0

@ user3170595 это новый вопрос. Если вам тоже нужен ответ, вы должны опубликовать его независимо от этого вопроса. – ControlAltDel

Смежные вопросы