目前我的班级看起来像这样(非常简化):
我有三个类来描述节点或方法(来自OpenStreetMap):
public abstract class Geometry {
private String id;
public Geometry(String id) {
this.id = id;
}
}
public class Node extends Geometry {
private GeoPoint location;
public Point(String id, GeoPoint location) {
super(id);
this.location = location;
}
public GeoPoint getLocation() {
return location;
}
}
public class Ways extends Geometry {
private ArrayList <GeoPoint> shape;
public Point(String id, ArrayList <GeoPoint> shape) {
super(id);
this.shape = shape;
}
public GeoPoint getShape() {
return shape;
}
}
现在我想迭代使用Geometry类的ArrayList并使用两个子类中的方法:
private void prepareList(ArrayList<Geometry> geometries) {
for (Geometry m : geometries) {
if (m.getClass().equals(Node.class)) {
location = m.getLocation();
}
else if (m.getClass().equals(Way.class)) {
shape = m.getShape();
}
}
}
在我的解决方案中,我需要在Geometry类中创建一些虚拟方法来访问这些方法,比如 public GeoPoint getLocation(){ return null; }
我现在的问题是,在Java中实现这一点的最佳方法是什么,而不是制作单独的类(导致代码重复)或编写这种“虚拟”方法。还有更好的方法吗?
答案 0 :(得分:0)
如果我正确理解您的问题,您只需在Geometry
上声明一个由<{1}}和Node
子实现的抽象方法类。
Ways
或考虑将Geometry设为界面。类似的东西:
public abstract class Geometry {
private String id;
public Geometry(String id) {
this.id = id;
}
public abstract GeoPoint getLocation();
}
并在public interface Traversable {
public String getId();
public GeoPoint getLocation();
}
和Ways
上实施此界面。我更喜欢后一种方法,因为一个类可以实现多个接口,但只能扩展一个超类。
修改强>:
现在,我从Nodes
和Ways
返回相同的内容,对我来说有点清楚。你可以:
Nodes
与GeoPoint
List
GeoPoints
或Way
在子类内执行的任何操作。Node
列表作为方法的返回类型,并且节点只返回一个元素,而不是GeoPoints