我的主要方法如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package excercise.pkg5;
/**
*
* @author Azraar
*/
public class TestResizable {
public static void main(String[] args) {
Shape obj[] = new Shape[4];
obj[0] = new Circle(10);
obj[1] = new Rectangle(10, 20);
obj[2] = new ResizableCircle(10);
obj[3] = new ResizableRectangle(10, 20);
for (int i = 0; i < obj.length; i++) {
if (obj[i] instanceof ResizableCircle) {
ResizableCircle r = (ResizableCircle) obj[i];
obj[i].equals(r);
}
if (obj[i] instanceof ResizableRectangle) {
ResizableRectangle r = (ResizableRectangle) obj[i];
obj[i].equals(r);
}
System.out.println("");
System.out.print("Object is - " + obj[i].name());
System.out.print("\nObject Area is - " + obj[i].area());
System.out.print("\nObject Perimeter is - " + obj[i].perimeter());
}
}
}
我正在使用ResizableRectangle r = (ResizableRectangle) obj[i];
,因为resizable是一个工具,ResizableRectangle和ResizableCircle正在扩展它并覆盖方法调整大小。
如果是instanceof resizbleRectange或resizableCircle ..我需要运行这个resize()方法..
obj[i].resize(0.5)
然后它将循环并打印。但问题是我没有得到调整大小的方法真正的知识产权,当我输入它说无法找到sympbol ...
是类层次结构......
修改
shape是ROOT CLASS,如附图所示。当对象是ResizeableClass和ResizeableRectangle的实例时,我正在考虑一种访问resize方法的方法。但仍然无法。
答案 0 :(得分:2)
您需要在resize()
引用上致电Resizeable
。
也就是说,如果obj[i]
是Resizeable
,那么您需要进行投射然后再调用它。仅仅断言obj[i]
引用这样的对象是不够的,因为编译器只是将它视为基类引用。
e.g。
if (obj[i] instanceof Resizeable) {
((Resizeable)obj[i]).resize(..);
}
答案 1 :(得分:1)
您将obj
声明为
Shape obj[]
所以obj[i]
将返回Shape
对象,我猜测该对象不会延伸Resizeable
。
答案 2 :(得分:1)
并非Shape方法的所有子类都实现Resizable接口。所以你需要检查obj[i]
是否是Resizeable类的实例,然后调用它上面的resize。
答案 3 :(得分:0)
这终于奏效了......
if (obj[i] instanceof ResizableCircle) {
Resizable c = (ResizableCircle) obj[i];
c.resize(5);
}
if (obj[i] instanceof ResizableRectangle) {
Resizable r = (ResizableRectangle) obj[i];
r.resize(10);
}