我必须在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
它应该是一个很好的面向对象的设计解决方案。
答案 0 :(得分:1)
如何将getRadius
添加到Figure中,然后在square的实现中抛出UnsupportedOperationException
?
答案 1 :(得分:1)
为什么不在标识子类的基类中添加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
没有例外
答案 2 :(得分:0)
如果你不能使用instanceof
,你可以在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();
}
}
}
答案 3 :(得分:0)
您可以尝试使用try / catch:
来阻止ClassCastExceptiontry {
((Circle) figure).getRadius();
} catch(ClassCastException e) {
//does nothing
}
答案 4 :(得分:0)
您希望编写适用于所有类型Figures
的代码,并且如果Figure
是Circle
或Square
,您需要不同的行为。这就是他们发明多态性的原因。您的代码如下:
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();