1

そのため、現在、Preprocessor一連のインスタンス変数マップを生成するクラスと、クラスのインスタンスがプリプロセッサが生成したマップにアクセスできるようにするメソッドServiceを持つクラスがあります。setPreprocessor(Preprocessor x)Service

現時点では、私のServiceクラスは 3 つのメソッドを連続して呼び出す必要があります。簡単にするために、それらexecutePhaseOneを 、executePhaseTwo、および と呼びましょうexecutePhaseThree。これら 3 つのメソッドはそれぞれ、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ます。次に、 3 つのフェーズすべてを連続して実行する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
    }
}

編集:

問題は、親クラスに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オブジェクトchildThreepreprocessor、親クラスに存在するインスタンス変数にアクセスできませんService...どうすればこの問題を乗り越えることができますか?

4

4 に答える 4

3

Use the protected modifier for your Preprocessor instance variable of Service, like so:

public class Service {
    protected Preprocessor preprocessor;
}

Then each subclass of Service has a this.preprocessor.

于 2013-08-01T00:40:04.350 に答える
0

Your preprocessor should be protected or public to be able to have an access from the child. You can read about modifiers here.

UPDATE

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

class ServiceChildOne extends Service {

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

    public void executePhaseOne() {
        // Do stuff
    }
}
于 2013-08-01T00:39:39.880 に答える
0

あなたの問題は、1 つではなく 4 つの異なるインスタンスがあることです。Serviceそれぞれのインスタンスには、基本クラス変数の初期化されていない独自のコピーがあります。

現時点で私が考えることができる唯一の解決策は、まず、Service メンバー変数を静的にする設計がかなり貧弱であることです。これは、実際には、一度に 1 つのバージョンの Service しか持てないことを意味します。私の考えでは、より良い解決策は、処理フェーズをサブクラスにするのではなくService、パラメーターとしてのインスタンスを取る独立したクラスにすることです。

編集:簡単な例として、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();
}
于 2013-08-01T02:03:33.127 に答える