[英]Access methods on different types
我有这样的事情:
Figures fig = new Line();
在哪条线上延伸图。 Figure 是一个抽象类,它只有一个getType()
方法,它通过返回一个String
来告诉我它是哪个图形; 我有 3 种类型, Rectangle
, Circle
和Figure
。 所有这些都扩展了Figures
。
现在是真正的问题。 我将每一个都存储在List<Figures>
并且我想访问每个对象上的某些方法,例如getStartX()
; 和getStartY()
; 我不能,我也只能访问Figures
上的方法。
您的抽象类应该定义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();
...
}
}
您可以将instanceof
与if...else
并动态转换您的对象
Figure fig = new //Circle()/Triangle()/Rectangle();
if( fig instanceof Circle) {
((Circle) fig).getRadius(); //This method is only available in Circle class
}
您始终可以将 Figure 转换为 Line,但不是最佳选择。 根据问题,您可以应用访问者模式或将这些方法添加到 Figure,即使 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
}
是一个更复杂的解决方案,但正如我所说,这取决于问题,并且大部分复杂的问题都保留在访问者中
getStartX()
和getStartY()
应该在Figure
类中声明,或者您需要将对象强制转换为Line
类:
Figure figure = figures.get(0);
if ("line".equals(figure.getType())) {
Line line = (Line)figure;
}
另一种选择是使用反射。 但是您仍然需要确保可以调用请求的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.