创建抽象方法而不修复其参数类型

时间:2014-12-10 15:35:55

标签: java parameters typing

我正在尝试实现一个Class结构,我可以在其中创建不同类型的Box-Objects。这些类型是:Squares, Circles, Rectangles and Hexagons

对于抽象父class Box,我想指定一个必须在所有子对象中实现的setDimensions()方法。

但是,所有对象的尺寸参数都不同(高度除外):

CirclesdiameterRectangleswidth and lengthHexagonsSquaresequally sized sides

是否可以定义可以处理此类作业的接口/抽象方法?

//编辑:这是一个编程任务。显然,所有类都有合适的构造函数,但是这个程序“模拟”一个项目,其中设计模式的实现应该是有用的。我正在尝试应用prototype模式,您可以在其中克隆基本框并根据我想要放在新框中的另一个框来设置参数。 我知道这不是一个非常好的例子,但我们必须以这种方式解决它。或者,factory pattern也是一个选项,但我想避免写太多工厂类。

4 个答案:

答案 0 :(得分:1)

这是我的两分钱。

你可以在抽象超类

中得到类似的东西
public abstract void setDimensions(double... dim);

一个示例实现(矩形)将是

// expected params are width and height
public void setDimension(double... dim) {
    if (dim.length != 2) {
        throw new IllegalArgumentException("Two dimensions expected, width ang height!");
    }
    ...
}

你会这样称呼它

Rectangle rec = new Rectangle();
rec.setDimensions(1.5, 2.8);
// rec.setDimensions(1.0); would throw IllegalArgumentException

限制是您必须知道您必须提供哪些参数,如果您错了,您将在运行时获得IllegalArgumentException,而不是编译器错误。

答案 1 :(得分:0)

这是类的一个小实现:

  interface Dimension{
       int getWidth();
       int getLenght();
       int getRadius();
      }

    CircleDimension implements Dimension{
       int radius;
       int getWidth(){
            return -1;
       }
       int getLenght(){
            return -1;
       }
       int getRadius(){
          return radius
       }
   }
    RectangleDimension implements Dimension{
       int width;
       int length;
       int getWidth(){
            return width;
       }
       int getLenght(){
            return length;
       }
       int getRadius(){
          return -1;
       }

class Box{
  void setDimension(Dimension dimension);
}

在Box类的子类中,你可以这样做:

class Rectangle{
    int length;
    int width;
    setDimension(Dimension dimension){
      if(!dimension.getClass().equals(RectangleDimension)){
             //thow illegal argument exception
      }else{
       length = dimension.getlength();
       width  = dimension.getwidth();
      }

    }

}

答案 2 :(得分:0)

好吧,你可以为维度创建一个并行类层次结构......

abstract class Dimensions {}
class Radius extends { double r; }
class WidthHeight extends { double w; double h; }

然后,您可以使用setDimensions方法将Dimensions作为参数。

我不确定我是否看到了这个实用程序:由于“维度”的概念在您的具体类之间存在很大差异,因此超类方法似乎没有用处。听起来它属于子类:Circle.setRadius(double r);Rectangle.setWidth(double w)Rectangle.setHeight(double h)等。

Square(或Diamond?)可以扩展Rectangle,并通过调用另一个方法来覆盖这两个方法,以确保两边保持相等。

答案 3 :(得分:0)

我同意 Dima dasblinkenlight ,它看起来不像setDimensions属于Box。但是 - 作为问题的替代答案 - 还有一种使用泛型来实现这一目标的方法:

abstract public class Box<D> {
    public abstract void setDimensions(D dimensions);
}

class Square extends Box<Double> {
    public void setDimensions(Double dimensions) {/*-*/}
}

class Circle extends Box<Double> {
    public void setDimensions(Double dimensions) {/*-*/}
}

// (say Tuple is a generic container for two elements)
public class Rectangle extends Box<Tuple<Double, Double>> {
    public void setDimensions(Tuple<Double, Double> dimensions) {/*-*/}
}

编辑:使用泛型的好处是您可以专门化setDimensions参数的类型。请注意,如果您在顶部定义了一个带有抽象类Dimension的类层次结构,则不能使用协变参数类型覆盖setDimensions(Dimension dimensions),也就是说,您不能将其覆盖为,例如setDimensions(CircleDimension dimensions)