1

抽象クラスがあります

public abstract class Integrator {
    public abstract Point integrate();
    public abstract Point function(Double x, Point y);
}

これはによって拡張されます

public abstract class Euler extends Integrator {
    public Point integrate() {
        ... // this calls function(x, y)
    }
}

public abstract class Central extends Integrator {
    public Point integrate() {
        ... // this calls function(x, y)
    }
}

どちらも実装がintegrate()異なります。今、私がインスタンス化する具体的なクラスは次のように定義されています

public class EulerIVP extends Euler {
    public EulerIVP(...) { ... }

    public Point function(Double x, Point y) {
        ...
    }
}

public class CentralIVP extends Central {
    public CentralIVP(...) { ... }

    public Point function(Double x, Point y) {
        ...
    }
}

どちらもfunction()まったく同じ方法で実装されますが、親のを使用しintegrate()ます。なぜならEuler、両方がクラスを拡張することは意味Centralabstractないからです。IVPだから私はこのようなことができると思っていました

public class IVP<T extends Integrator> extends T {
    public IVP(...) { ... }
    public Point function(Double x, Point y) { ... }
}

Integrator eulerIntegrator = new IVP<Euler>(...);
Integrator centralIntegrator = new IVP<Central>(...);

Tしかし、私は、ここにクラスではなくタイプがあると信じているので、私はできません。私に似たようなことはありますか?

4

1 に答える 1

5

継承の代わりに構成を使用できます。何かのようなもの:

public class IVP {
    private Integrator integrator;

    public IVP(Integrator integrator) {
        this.integrator = integrator;
    }

    public Point function(Double x, Point y) {
        // Calculate using integrator.integrate();
    }
}

次に、euler を非抽象クラスにします。

IVP eulerIVP = new IVP(new Euler());
于 2012-11-03T22:23:22.623 に答える