在异构Java阵列中管理不同的对象
我必须用Java解决这个“容器问题”。我有一个由不同数字组成的数组,我希望下面的代码能够工作:在异构Java阵列中管理不同的对象,java,arrays,polymorphism,containers,heterogeneous,Java,Arrays,Polymorphism,Containers,Heterogeneous,我必须用Java解决这个“容器问题”。我有一个由不同数字组成的数组,我希望下面的代码能够工作: package container; class Figure{ public void draw() {} public String getColor() { return null; } } class Square extends Figure{ @Override public void draw()
package container;
class Figure{
public void draw() {}
public String getColor() { return null; }
}
class Square extends Figure{
@Override
public void draw(){
System.out.println("Square");
}
}
class Circle extends Figure{
@Override
public void draw(){
System.out.println("Circle");
}
public float getRadius(){
return 8;
}
}
public class Container {
public static void main(String[] args) {
Figure[] figures = new Figure[3];
figures[0]= new Circle();
figures[1]= new Circle();
figures[2]= new Square();
for(Figure figure:figures){
figure.getColor();
figure.draw();
((Circle) figure).getRadius();
}
}
}
您可以看到有一个问题,因为Square
没有getRadius()
方法。我有以下限制:
- 不能使用泛型
- 无法使用
instanceof
这应该是一个很好的面向对象的设计解决方案。如果不能使用
instanceof
可以在Figure
类中声明抽象方法,并为不需要它的Figure添加虚拟实现。以下代码没有instanceof
和java泛型:
package container;
abstract class Figure {
public void draw(){};
public String getColor(){return null;};
protected abstract float getRadius();
}
class Square extends Figure{
@Override
public void draw(){
System.out.println("Square");
}
// zero radius for non-circle figures, for instance
// or you can throw UnsupportedOperationException here.
public float getRadius() { return 0;}
}
class Circle extends Figure{
@Override
public void draw(){
System.out.println("Circle");
}
public float getRadius(){
return 8;
}
}
public class Container {
public static void main(String[] args) {
Figure[] figures = new Figure[3];
figures[0]= new Circle();
figures[1]= new Circle();
figures[2]= new Square();
for(Figure figure:figures){
figure.getColor();
figure.draw();
figure.getRadius();
}
}
}
您可以尝试使用try/catch防止ClassCastException:
try {
((Circle) figure).getRadius();
} catch(ClassCastException e) {
//does nothing
}
将
getRadius
添加到图形中,然后在square的实现中抛出一个UnsupportedOperationException
。您希望编写适用于所有类型的图形的代码,如果图形
是一个圆
或正方形
,则需要不同的行为。这就是他们发明多态性的原因。您的代码如下所示:
Figure f;
if (f is Circle) {
doFoo();
} else {
doBar();
}
相反,更好的方法如下:
interface Figure {
public void do();
}
class Circle implements Figure {
public void do() {
doFoo();
}
}
class Square implements Figure {
public void do() {
doBar();
}
}
然后您的代码变成:
Figure f;
f.do();
为什么不向标识子类的基类添加一个enum FigureType
public static enum FigureType {
Square,
Circle
}
public static class Figure {
private FigureType type;
public Figure(FigureType type) {
this.type = type;
}
public FigureType getType() {
return type;
}
public void draw() {
}
public String getColor() {
return null;
}
}
您必须为调用父类构造函数的每个子类添加一个默认构造函数,该子类使用其FigureType
public static class Square extends Figure {
public Square() {
super(FigureType.Square);
}
@Override
public void draw() {
System.out.println("Square");
}
}
public static class Circle extends Figure {
public Circle() {
super(FigureType.Circle);
}
@Override
public void draw() {
System.out.println("Circle");
}
public float getRadius() {
return 8;
}
}
用法:
public static void main(String[] args) {
Figure[] figures = new Figure[3];
figures[0] = new Circle();
figures[1] = new Circle();
figures[2] = new Square();
for (Figure figure : figures) {
figure.getColor();
figure.draw();
if (figure.getType() == FigureType.Circle) {
((Circle) figure).getRadius();
}
}
}
结果:
Circle
Circle
Square
没有例外预期的行为是什么?正方形不是圆形-这条线应该如何工作?我知道这会很完美,但我得到了“不能使用instanceof”的限制。这是对的,但如果圆形有一些行为(getRadious),它在正方形和图形中不存在呢?那么不要向用户公开它。用户为什么需要半径。用户可能正在尝试执行一些与图形相关的操作,我称此操作为do
。