[英]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.