让我们举一个例子,我有两个班级," Triangle"和"平行四边形",和界面" Side" " Triangle" class只有3个变量--a,b和c,它们存储了它的端点。对于"矩形"相同,除了a,b,c和d。
现在,我想传递一个" Side"作为" Plane"的参数等级,需要3点,并根据它们制作飞机 我怎么做到这一点,因为我不能只使用side.a,因为编译器不确定" Side"有变量a。
此外,稍微不相关,但我怎么能确定一个" Side"实际上是一个" Triangle"或者"平行四边形"?
答案 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
为空,并且实现的任何内容都保证字段a
,b
和c
存在并且是公开的。
以下是使用反射的解决方案。
// 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来捕获这可能引发的所有异常。因此,不推荐这种方法。