bou*_*ful 1 java generics polymorphism inheritance
我有一个抽象的课
public abstract class Integrator {
public abstract Point integrate();
public abstract Point function(Double x, Point y);
}
Run Code Online (Sandbox Code Playgroud)
延长了
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)
}
}
Run Code Online (Sandbox Code Playgroud)
两者的实施方式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) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
它们都以function()完全相同的方式实现,但将使用它们的父级integrate().因为Euler和Central是abstract它没有意义对他们都扩展一个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>(...);
Run Code Online (Sandbox Code Playgroud)
但我不能因为,我相信,T这里的类型不是一类.有什么类似我能做的吗?
您可以使用合成而不是继承.就像是:
public class IVP {
private Integrator integrator;
public IVP(Integrator integrator) {
this.integrator = integrator;
}
public Point function(Double x, Point y) {
// Calculate using integrator.integrate();
}
}
Run Code Online (Sandbox Code Playgroud)
然后使euler成为一个非抽象类:
IVP eulerIVP = new IVP(new Euler());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |