2009-07-27 3 views
1

Я искал способ сделать следующее:Определение осуществления для абстрактного объекта

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

B Проект: Определяет реализацию для абстрактного класса Запускает двигатель.

Как я могу зарегистрировать класс реализации и убедиться, что это тот, который вызывается при запуске двигателя.

EDIT 1: Регистром я имею в виду, я должен каким-то образом определить, какой является реализация, которая должна вызываться для этого данного абстрактного объекта

Извините, если вопрос не слишком ясно, дайте мне знать, если вам нужно еще немного Детальная информация

+0

Что вы подразумеваете под «зарегистрировать класс реализации»? –

+0

Насколько я понимаю (возможно, вы можете дать более подробное разъяснение, например, Pesudo Code), вам нужно будет создать экземпляр фактической реализации проекта B как ссылку на абстрактный класс A Project. – Daff

ответ

1

Во время выполнения вы можете иметь имя реализации, переданное в вашем проекте A (с файлом свойств или системным свойством Java). Затем вы найдете этот класс в pathpath с class.forName() и создайте его с помощью newInstance().

Но вы бы предпочли использовать фреймворк, такой как Guice или Spring, что позволит вам склеить вещи в чистом виде.

+0

+1 для ссылки на guice –

+0

Решение, которое я реализовал, основано на вашем первом sugestion, я посмотрел на Guice и может закончиться тем, что собирается, но на данный момент этого достаточно thx –

2

Что-то вроде этого?

class A implements EventHandlerForB { 
... 
} 

public class B { 
    private EventHandlerForB eventHandler; 

    public void registerEventHandler(EventHandlerForB eventHandler) { 
    this.eventHandler = eventHandler; 
    } 
... 
} 

public interface EventHandlerForB { 
... 
} 
+0

Передача показала, что конструктор, вероятно, лучше для одноадресной передачи. –

+0

Это решение потребовало от меня кода класса, который вызывает обработчик, который я не делаю. используя ваши объекты, в моем классе проблем B будет закрыто, и класс A будет тем, что я реализую. –

0

Существует несколько «шаблонов», которые пытаются решить эту проблему. Используя только классы JDK (6 или выше), вы можете взглянуть на java.util.ServiceLoader

+0

Nooooooooooo !!!!!!!!!! Не ServiceLoader! –

+0

почему нет? пожалуйста, объясни! – dfa

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