我有一个名为“Shape”的接口和2个实现它的类(Circle,Square)。
我还有一个Shape
(Shape shapes=new Shape[20]
)数组。
我如何知道特定单元格中的哪个形状(Circle
或Square
)
(哪个形状在shapes[0]
,shapes[1]
等等......)?
答案 0 :(得分:3)
如@jwa所述,您可以使用instanceof
来检查类型。根据实际类型处理形状的经典解决方案是访客模式:
interface Shape {
accept(ShapeProcessor processor);
}
class Circle implements Shape {
accept(ShapeProcessor processor) {
processor.visit(this);
}
}
class Squere implements Shape {
accept(ShapeProcessor processor) {
processor.visit(this);
}
}
interface ShapeProcessor {
visit(Circle circle);
visit(Squere squere);
}
答案 1 :(得分:1)
您可以使用instanceof
语法检查对象是否是特定类的实例。这允许您根据其形状执行不同的操作:
for(int i = 0; i < shapes.length; i++) {
if (shape[i] instanceof Circle) {
System.out.println("Shape " + i " is a Circle");
} else if (shape[i] instanceof Square) {
System.out.println("Shape " + i " is a Square");
}
}
或者,如果您不需要针对每种类型执行特定操作,并且您只想列出它们:
for(int i = 0; i < shapes.length; i++) {
System.out.println("Shape " + i " is a " + shapes[i].getClass());
}
答案 2 :(得分:0)
正如@Thomas所指出的,你通常不应该在意。这个想法是所有实例都实现一个接口或扩展一个公共类。你应该把它们想象成形状。
如果你想绘制它们,可以通过赋予每个类实现的Shape draw(canvas)
方法将此责任放在类中。现在,您可以轻松添加更多形状而不会破坏当前代码。每个形状都知道如何画出自己。
你可以使用@jwa提供的回答实例。但在面向对象语言中,instanceof实际上是一种代码味道。
有关代码气味的实例的信息:http://smsohan.blogspot.nl/2011/11/using-instanceof-is-mostly-code-smell.html
答案 3 :(得分:0)
简单而又丑陋的选择是使用instanceof
运算符,如另一个答案中所述。但是,请考虑是否可以向Shape
添加抽象方法来执行您需要执行的操作。
对于更复杂的情况,此方法实际上可能是工厂方法,并返回另一个抽象类或接口(如interface ShapeTransformer
的(私有子类)的实例,而Circle类将具有private class CircleTransformer implements ShapeTransformer
等
或使用另一个答案中解释的访客模式。
细节实际上取决于你想做什么。对于一些案例,使用instanceof
的if-elseif阶梯很好,只要你意识到如果代码的寿命比你预期的要长,它就会回来了。