从ParentClass访问ArrayList中的子类方法

时间:2014-04-14 17:31:12

标签: java inheritance

目前我的班级看起来像这样(非常简化):

我有三个类来描述节点或方法(来自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中实现这一点的最佳方法是什么,而不是制作单独的类(导致代码重复)或编写这种“虚拟”方法。还有更好的方法吗?

1 个答案:

答案 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上实施此界面。我更喜欢后一种方法,因为一个类可以实现多个接口,但只能扩展一个超类。

修改: 现在,我从NodesWays返回相同的内容,对我来说有点清楚。你可以:

  • 将结果包含在一个可以处理单NodesGeoPoint List
  • 的类中
  • 重新执行此代码,以执行GeoPointsWay在子类内执行的任何操作。
  • 使用Node列表作为方法的返回类型,并且节点只返回一个元素,而不是GeoPoints
  • 返回的多个点