如何解释和使用给定接口对象的类?

时间:2016-05-20 18:35:52

标签: java oop design-patterns reflection

我有一个界面。我的一个方法将此接口的对象作为参数。根据具体的类,我想构建一个不同的对象。

public interface Shape {
  public void draw();
}

public class Circle implements Shape {
  private int radius;
  //constructor etc.

  public void draw() {
    System.out.println("CIRCLE!");
  }

  public int getRadius() {
    return radius;
  }
}

public class Square implements Shape {
  private int side;

  //constructor etc.

  public void draw() {
    System.out.println("SQUARE!");
  }

  public int getSide() {
    return side;
  }
}


public class MyClass {
  public void myJob(Shape shape) {
    if (shape.getClass().toString().equals("Circle")) {
      // some missing code...what to do here? type cast? transform?
      int radius = shape.getRadius();
    }
  }
}

如何使用Shape界面,然后根据课程类型获取radiusside

3 个答案:

答案 0 :(得分:2)

所有特定于Shape的代码都应位于每个子类重写的方法中。

public interface Shape {
    public void draw();
    public int getMeasure();
}

public class Circle implements Shape { ... } // The code for the methods in Shape should be written here.

public class Square implements Shape { ... }

public class MyClass {
    public void doWork(Shape shape) {
        int measure = shape.getMeasure();
    }
}

通常,在运行时按名称查找类是一个不必要的麻烦,可以避免。

编辑问题。

答案 1 :(得分:2)

首先,不需要为此使用反射,您可以使用关键字instanceof

public void myJob(Shape shape) {
    if (shape instanceof Circle) {
        // some missing code...what to do here? type cast? transform?
        int radius = shape.getRadius();
    }
}

然后,你想要做的是将你的形状塑造成一个圆圈,这样你就可以像圆圈一样对待它:

public void myJob(Shape shape) {
    if (shape instanceof Circle) {
        Circle circle = (Circle) shape;
        // Some Circle job
        int radius = circle.getRadius();
    }
}

最后,如果你说你想对Shape的不同实现应用不同的处理方法,你可以显式地输入参数:

public void myJob(Circle circle) {
    // Some Circle job
}

public void myJob(Square square) {
    // Some Square job
}

但是,更好的方法是使用Shape接口:

public interface Shape {
    void draw();
    void myJob();
}

public class MyClass {
    public void myJob(Shape shape) {
        shape.myJob();
    }
}

}

答案 2 :(得分:0)

您可以使用instanceof检查它是否是Circle的实例,然后再将其转换为Circle。

if (shape instanceof Circle) {
  Circle circle = (Circle)shape;
  int radius = circle.getRadius();
}