簡體   English   中英

不同類型的訪問方法

[英]Access methods on different types

我有這樣的事情:

Figures fig = new Line(); 

在哪條線上延伸圖。 Figure 是一個抽象類,它只有一個getType()方法,它通過返回一個String來告訴我它是哪個圖形; 我有 3 種類型, RectangleCircleFigure 所有這些都擴展了Figures

現在是真正的問題。 我將每一個都存儲在List<Figures>並且我想訪問每個對象上的某些方法,例如getStartX() getStartY() ; 我不能,我也只能訪問Figures上的方法。

您的抽象類應該定義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();
    ...
  }
}

您可以將instanceofif...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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM