Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在异构Java阵列中管理不同的对象_Java_Arrays_Polymorphism_Containers_Heterogeneous - Fatal编程技术网

在异构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()

我必须用Java解决这个“容器问题”。我有一个由不同数字组成的数组,我希望下面的代码能够工作:

 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