我有这样的事情:
Figures fig = new Line();
on the line延伸图。图是一个抽象类,只有一个方法getType()
通过返回String
来告诉我它是什么形象;
我有3种类型,Rectangle
,Circle
和Figure
。所有这些都延伸Figures
。
现在真正的问题。我将每一个存储在List<Figures>
内,我希望能够访问每个对象上的一些方法,如getStartX()
;和getStartY()
;我不能,我也只能访问Figures
上的方法。
答案 0 :(得分:1)
您的抽象类应该定义getStartX
和getStartY
方法。如果您希望Rectangle
,Circle
和Figure
具有不同的行为并强制它们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;
}
另一种选择是使用反射。但是你仍然需要确定,可以调用所请求的方法。