【发布时间】:2012-03-29 19:52:30
【问题描述】:
我创建了一个扩展 Point2D.Double 的 Vector2D 类。
Vector2D 有两个字段:幅度和方向。 Point2D.Double 的扩展还允许向量存储起始位置。
我喜欢这样做的能力:
Vector2D myVector = new Vector2D(50, 50); // instantiated without direction or magnitude
Point2D.Double myPoint = new Point2D.Double(myVector.getLocation());
但是,我不想这样做:
Point2D.Double myPoint = myVector;
还有这个:
Point2D.Double myPoint.setLocation(myVector);
因为这两个操作都将myVector 视为只是 Point2D.Double。
我知道 Java 不允许覆盖或重载运算符,因此第一个不受欢迎的情况似乎特别难以消除。我也知道我可以用一个空的方法体覆盖.setLocation()(以防止它被使用),但这并不是一个很好的解决方案。
有没有办法禁止 Vector2D 存在于Point2D.Double 中的方法或运算符?
【问题讨论】:
-
组合优于继承。
-
如果您通过 Vector 扩展 Point2D 的唯一原因是存储起始位置,为什么不让 2D 点成为 Vector 的成员?
-
嗯,我也喜欢
.distance()等方法。我想我可以简单地编写自己的方法,使用私有Point2D字段进行计算。 -
Math.hypot()很方便。
标签: java inheritance overriding overloading extends