我有一个界面。我的一个方法将此接口的对象作为参数。根据具体的类,我想构建一个不同的对象。
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
界面,然后根据课程类型获取radius
或side
?
答案 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();
}