Java 如何解释和使用给定接口对象的类?
我有一个接口。我的一个方法将此接口的一个对象作为参数。根据具体的类,我想构建一个不同的对象Java 如何解释和使用给定接口对象的类?,java,oop,design-patterns,reflection,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
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();
}
}
}
如何获取
形状
接口,然后根据类的类型从中获取半径
或侧面
?所有特定于形状
的代码都应该位于每个子类覆盖的方法中
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();
}
}
通常,在运行时按名称查找类是可以避免的不必要的麻烦
为问题编辑。您可以使用instanceof检查它是否是圆的实例,如果是,则将其转换为圆
if (shape instanceof Circle) {
Circle circle = (Circle)shape;
int radius = circle.getRadius();
}
首先,不需要为此使用反射,您可以使用关键字
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();
}
}
最后,如果如您所说,希望对形状的不同实现应用不同的处理方法,则可以显式键入参数:
public void myJob(Circle circle) {
// Some Circle job
}
public void myJob(Square square) {
// Some Square job
}
但是,更好的方法是使用形状界面:
public interface Shape {
void draw();
void myJob();
}
public class MyClass {
public void myJob(Shape shape) {
shape.myJob();
}
}
}问题是什么?你应该研究使用多态性来解决问题,而不是试图将其转换为圆形或方形。因此,你希望处理一个接口,而不是一个具体的类来抽象掉任何实现细节,然后,当你真正掌握了这样的接口时,您坚持确切地知道您正在处理的对象的类型,以便可以调用接口不提供的某些方法。这是毫无意义的。使用多个myJob方法会更好,每个方法都采用不同的类型(圆形、方形等)。使用运算符实例修复损坏的抽象不是一个好的答案。我最终在形状本身中包含了myJob()。因为
shape
将始终调用正确的方法。