2013-08-16 6 views
2

Мне нужно написать некоторые импортеры. Им нужна все та же инициализация. Поэтому я стараюсь, чтобы написать абстрактный класс, который делает всю инициализацию, а также имеет основной метод, так что все подклассы необходимо реализовать run() делать свою конкретную работу импорта:Как написать абстрактный основной класс

public abstract class AbstractImporter { 

    public AbstractImporter() { 
     // Initialization 
    } 

    public abstract void run(); 

    public static void main(String[] args) { 
     AbstractImporter importer = new AbstractImporter(); 
     importer.run(); 
    } 

} 

public class ConcreteClass() { 

    public void run() { 
    // Do some importing 
    } 

} 

Конечно, это не удается для создания экземпляра этого абстрактного класса (new AbstractImporter()).

Кто-нибудь знает, как это решить? ТИА!

+0

Что вы хотите сделать главным способом? –

+0

@JBNizet Мне нравится избегать основного метода в конкретных подклассах, поэтому основной метод этого абстрактного суперкласса должен создать экземпляр подкласса и вызвать метод run. – t777

+1

как u будет создавать экземпляр класса child в основном методе родительского класса? Вы уверены, что вы хотите сделать? – saurav

ответ

4

Очевидно, что вам нужен конкретный класс - анонимный или иной.

Лучше переместить основной метод в другой класс и создать соответствующий конкретный класс на основе данных (либо вашего домена, либо константы), а затем запустить его. Таким образом, каждая реализация может быть независимой от других реализаций.

public abstract class AbstractImporter { 

    public AbstractImporter() { 
     // Initialization 
    } 

    public abstract void run(); 
} 

public class ConcreteImporter1 extends AbstractImporter { 
    public void run() { 
     //do something 
    } 
} 


public class ImporterMain() { 

    public static void main(String[] args) { 
     AbstractImporter importer = createImporter(args[1]); 
     importer.run(); 
    } 

    private static AbstractImporter createImporter(String type) { 
     if (type.equals("1")) { 
      return new ConcreteImporter1(); 
     } 
     .... 
    } 
} 
1
new AbstracterImporter() { 
    public void run() { 
    // ... 
    } 
}; 

Прошу прощения за текущее отсутствие форматирования, в настоящее время на мобильном устройстве.

+0

Я отформатировал ваш код. Почему вы откатили его обратно? –

+0

Извините, я никогда не замечал, не хотел редактировать его после, но я был опечатан, чтобы добавить в 'void' до' run' –

+2

ОК, но, конечно же. сделанный. 1+ –

0
public abstract class AbstractImporter { 

    public AbstractImporter() { 
     // Initialization 
    } 

    public abstract void run(); 

    public static void main(String[] args) { 
     AbstractImporter importer = new AbstractImporter(){ 
      public void run() { 
       System.out.println("Anonymous implementation"); 
      } 
     }; 
     importer.run(); 
    } 
} 
0

Вы не можете создать экземпляр абстрактного класса.

public abstract class AbstractImporter { 

public AbstractImporter() { 
    // Initialization 
} 

public abstract void run(); 

} 

public class ConcreteClass extends AbstractImporter{ 

    public void run(){ 
      //Implementation 

    }   

    public static void main(String args[]){ 

      AbstractImporter ai = new ConcreteClass(); 
      ai.run(); 

    } 

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