访问不同类型的方法

时间:2015-05-13 14:07:51

标签: java android inheritance methods

我有这样的事情:

Figures fig = new Line(); 

on the line延伸图。图是一个抽象类,只有一个方法getType()通过返回String来告诉我它是什么形象; 我有3种类型,RectangleCircleFigure。所有这些都延伸Figures

现在真正的问题。我将每一个存储在List<Figures>内,我希望能够访问每个对象上的一些方法,如getStartX();和getStartY();我不能,我也只能访问Figures上的方法。

4 个答案:

答案 0 :(得分:1)

您的抽象类应该定义getStartXgetStartY方法。如果您希望RectangleCircleFigure具有不同的行为并强制它们Override这些方法,请抽象。另外,只需将方法放在Figures中即可使用(根据您的需要使用相应的关键字public / protected)。

如果要使用特定于类的方法,则需要检查它是哪个实例。像

这样的东西
for (Figures figure: myList) {
  int x = figure.getStartX(); // Method common and declared in Figures  
  if (figure instanceof Circle) {
    System.out.println("Oh no a Circle!");
    int radius = ((Circle)figure).getRadius();
    ...
  }
}

对于Rectangle / Line,您可以使用2种方法定义接口:

public interface HasEndpoints {
  int getEndX();
  int getEndY();
}

public class Rectangle implements HasEndpoints {
   ...
   public int getEndX() {return endx;}
   ...
}

for (Figures figure: myList) {
  int x = figure.getStartX(); // Method common and declared in Figures  
  if (figure instanceof HasEndpoints) { // Rectangle and Line will go there
    System.out.println("HasEndpoints implementor");
    int endX = ((HasEndpoints)figure).getEndX();
    ...
  }
}

答案 1 :(得分:0)

您可以rDate使用instanceof并动态投射您的对象

if...else

答案 2 :(得分:0)

您始终可以将图形转换为线条,但不是最佳选择。根据问题,您可以应用Visitor Pattern或将这些方法添加到图中,即使Circle没有起点和终点。

例如

public abstract class Figure{
    public abstract void visit(FigureVisitor visitor);
}

public class Line extends Figure{
    public void visit(FigureVisitor visitor){
        visitor.visitLine(this);
    }
}

public interface FigureVisitor{
    public void visitLine(Line figure);
    public void visitCircle(Circle figure);
}

public class StartingPointsVisitor implements FigureVisitor{
    private Double startX;
    private Double startY;
    private Double endX;
    private Double endY;

    public void visitLine(Line figure){
        this.startX = figure.getStartX(); //No cast needed
        ...
    }
    public void visitCircle(Circle figure){
        //Stub-method
    }

    //Getters to read the results
}

是一个更复杂的解决方案,但正如我所说,它取决于问题,而且大多数复杂的遗留在访客

答案 3 :(得分:-1)

getStartX()getStartY()应该在Figure类中声明,或者您需要将对象强制转换为Line类:

Figure figure = figures.get(0);
if ("line".equals(figure.getType())) {
   Line line = (Line)figure;
}

另一种选择是使用反射。但是你仍然需要确定,可以调用所请求的方法。