2013-08-01 5 views
0

Так прямо сейчас у меня есть Preprocessor класса, который генерирует пучок переменных карт, например, и Service класса, который имеет метод setPreprocessor(Preprocessor x), так что экземпляр Service класса способен для доступа к картам, которые генерировал препроцессор.Доступ к переменному экземпляру родительского класса из экземпляров класса детей

На данный момент класс Service должен звонить по три метода подряд; для простоты, назовем их executePhaseOne, executePhaseTwo и executePhaseThree. Каждый из этих трех методов создает экземпляры экземпляра/изменения Service, некоторые из которых являются указателями на объект Service экземпляра Preprocessor.

Мой код имеет такую ​​структуру прямо сейчас:

Preprocessor preprocessor = new Preprocessor(); 
preprocessor.preprocess(); 
Service service = new Service(); 
service.setPreprocessor(preprocessor); 
service.executePhaseOne(); 
service.executePhaseTwo(); 
service.executePhaseThree(); 

Чтобы лучше организовать свой код, я хочу, чтобы поместить каждый executePhaseXXX() вызов в своем собственном отдельном подклассе Service и оставить общие структуры данных для всех фаз в родительском классе Service. Тогда, я хочу иметь execute() метод в Service родительского класса, который выполняет все в три этапа в последовательности:

class ServiceChildOne extends Service { 
    public void executePhaseOne() { 
     // Do stuff 
    } 
} 

class ServiceChildTwo extends Service { 
    public void executePhaseTwo() { 
     // Do stuff 
    } 
} 

class ServiceChildThree extends Service { 
    public void executePhaseThree() { 
     // Do stuff 
    } 
} 

EDIT:

Проблема заключается в том, как я пишу execute() метод в Service родителя класс? У меня есть:

public void execute() { 
    ServiceChildOne childOne = new ServiceChildOne(); 
    ServiceChildTwo childTwo = new ServiceChildTwo(); 
    ServiceChildThree childThree = new ServiceChildThree(); 
    System.out.println(childOne.preprocessor); // prints null 
    childOne.executePhaseOne(); 
    childOne.executePhaseTwo(); 
    childOne.executePhaseThree(); 
} 

Однако мой childOne, childTwo и childThree объекты не в состоянии получить доступ к переменной preprocessor экземпляра, который живет в родительском классе Service ... Как я мог пройти мимо этой проблемы?

ответ

0

Ваш preprocessor должен быть protected или public, чтобы иметь возможность получить доступ от ребенка. Вы можете прочитать об модификаторах here.

UPDATE

new ServiceChildOne(new Preprocessor()); 
..... 

class ServiceChildOne extends Service { 

    public ServiceChildOne(Preprocessor preprocessor) { 
     super.preprocessor = preprocessor; 
    } 

    public void executePhaseOne() { 
     // Do stuff 
    } 
} 
+0

Это уже «защищено», но оно по-прежнему равно нулю. См. Редактирование в оригинальной записи, пожалуйста. –

+0

@ Ryan Yu См. Обновление. – Alex

+0

Спасибо. Тем не менее, последующее наблюдение: мне нужно иметь доступ к _all_ переменных экземпляра, которые живут в родительском классе 'Service', а не только в препроцессоре. Если не передать их все в конструктор в подкласс, есть ли другой способ получить эту функциональность? Возможно, какой-то способ создания экземпляров подкласса? Есть идеи? Благодарю. –

2

Используйте модификатор protected для Preprocessor экземпляра переменной Service, например так:

public class Service { 
    protected Preprocessor preprocessor; 
} 

Тогда каждый подкласс Service имеет this.preprocessor.

+0

Он уже защищен, но он по-прежнему недействителен. См. Редактирование в оригинальной записи, пожалуйста. –

0

Вы могли бы предоставить какой-то способ, как getPreprocessorInstance() в вашем Service класса, который возвращает Preprocessor экземпляра

0

Это выглядит как ваша проблема в том, что у вас есть не один, а четыре разные экземпляров Service - каждый из которых имеет свою собственную неинициализированную копию переменных базового класса.

Единственные решения, о которых я могу думать в настоящий момент, это, во-первых, довольно плохой дизайн, заключающийся в том, что ваши переменные-члены службы статичны, что фактически означает, что вы можете иметь только одну версию Сервиса за раз.Лучшее решение, на мой взгляд, было бы не сделать подклассы фаз обработки, а вместо этого сделать их независимыми классами, которые принимают в качестве параметра экземпляр Service.

EDIT: Для быстрого например, Service класса может выглядеть следующим образом:

class Service 
{ 
    public Service() { ... } 
    public Preprocessor getPreprocessor() { ... } 
    public void setPreprocessor(Preprocessor preprocessor { ... } 
    public Type2 getVariable2() { ... } 
    public void setVariable2(Type2 variable2) { ... } 
     ... 
} 

и фазовые классы могли бы выглядеть примерно так:

class ServicePhaseOne 
{ 
    private Service m_dataHost; 

    public ServicePhaseOne(Service dataHost) 
    { 
     m_dataHost = dataHost; 
    } 

    public void executePhaseOne() 
    { 
     // Do phase 1 stuff 
    } 
} 

... и так далее для фазы 2 и фазе 3.

Метод execute() будет выглядеть так:

public void execute() 
{ 
    ServicePhaseOne phaseOne = new ServicePhaseOne(this); 
    ServicePhaseTwo phaseTwo = new ServicePhaseTwo(this); 
    ServicePhaseThree phaseThree = new ServicePhaseThree(this); 
    phaseOne .executePhaseOne(); 
    phaseTwo .executePhaseTwo(); 
    phaseThree .executePhaseThree(); 
} 
Смежные вопросы