如何传递一个可能是一堆类似对象中的任何一个的参数?

时间:2016-10-08 05:37:06

标签: java interface

让我们举一个例子,我有两个班级," Triangle"和"平行四边形",和界面" Side" " Triangle" class只有3个变量--a,b和c,它们存储了它的端点。对于"矩形"相同,除了a,b,c和d。

现在,我想传递一个" Side"作为" Plane"的参数等级,需要3点,并根据它们制作飞机 我怎么做到这一点,因为我不能只使用side.a,因为编译器不确定" Side"有变量a。

此外,稍微不相关,但我怎么能确定一个" Side"实际上是一个" Triangle"或者"平行四边形"?

3 个答案:

答案 0 :(得分:0)

您的界面应设计为向使用它的代码提供必要的信息。在您提供的示例中,这些类可以实现的更有用的接口可能是名为Shape的东西,它有两个方法:getNumberOfPoints和getPoint。您可以使用此信息来区分形状(或不区分它们,因为可能确切的形状不重要,只有形状数据)。

答案 1 :(得分:0)

当然,你可以从外面做(它更难但不是不可能),但是因为Side / PolyhedronFace的定义将平面作为内在属性,所以&# 39;要求子类自己报告这个平面要好得多。

interface Side {
  // This method should return false if the face is not a valid 
  // planar figure (more than 3 points not all coplanar
  // or a degenerate case: 3 points on the same line or coincidental).
  public boolean isValid();

  // this method will return the supporting plane if isValid
  // otherwise throws 'InvalidStateException`
  public Plane3d getPlaneDef();
}

public class PolygonalFace
implements Side {
  // Store your set of points defining the Face here
  protected List<Point3d> vertices;

  // constructor and other methods here

  static protected Plane3d computePlaneIfOk(List<Point3d> vertices) {
    // implement here the magic to compute the plane definition 
    // if there is one or return null if there isn't one
  }

  @Override
  public boolean isValid() {
    return (null!=PolygonalFace.computePlaneIfOk(this.vertices));
  }

  @Override
  public Plane3d getPlaneDef() {
    Plane3d ret=PolygonalFace.computePlaneIfOk(this.vertices);
    if(null==ret) {
      throw new IllegalStateException();
    }
    return ret;
  }
}

答案 2 :(得分:0)

我不太明白你的问题。但我猜你有这样的事情:

class Triangle implements Side {
    private Point a, b, c;

    // getters for a, b, c...
}

class Parallelogram implements Side {
    private Point a, b, c, d;

    // getters for a, b, c, d...
}

interface Side {
    // you don't know what to write here
}

class Plane {
    public void someMethod(Side side) {
        // this method needs at least 3 points, but if more points are
        // present, say 5, work with 5 points.
    }
}

我希望我能正确理解你。所以我想你只需要完成Side界面。

如果我是你,我会这样写:

interface Side {
    Point[] getEndPoints();
}

您可以在三角形和平行四边形类中实现它,如下所示:

class Triangle implements Side {
    private Point a, b, c;

    // getters for a, b, c...

    public Point[] getEndPoints() { return new Point[] {a, b, c}; }
}

class Parallelogram implements Side {
    private Point a, b, c, d;

    // getters for a, b, c, d...

    public Point[] getEndPoints() { return new Point[] {a, b, c, d}; }
}

要检查是否有三个点,只需执行

  if (side.getEndPoints().length >= 3)

要检查参数是否为三角形,请执行以下操作:

  if (side instanceof Triangle)

编辑:

您说您希望Side为空,并且实现的任何内容都保证字段abc存在并且是公开的。

以下是使用反射的解决方案。

// in the method in the Plane class
Class<? extends Side> clazz = side.getClass();
Field aField = clazz.getField("a");
Field bField = clazz.getField("b");
Field cField = clazz.getField("c");

// getting the values of the fields
Point aPoint = (Point)aField.get(side);
Point bPoint = (Point)bField.get(side);
Point cPoint = (Point)cField.get(side);

请注意,您还需要添加一个非常长的throws子句或使用try catch来捕获这可能引发的所有异常。因此,不推荐这种方法。