我对结构的创建感到困惑:代表一般物理变换的接口Transform和代表特定类型的变换的PoincareTransform类。我想做这样的事情
public interface Transform {
public Transform compose(Transform t);
}
public class PoincareTransform implements Transform {
private Matrix matrix;
public Transform compose(Transform t) {
...
}
}
但我希望该方法compose(Transform T)仅采用PoicareTransform,因为必须具有要构成的矩阵。一个可能的解决方案是使用泛型
public interface Transform<T extends Transform<T>> {
public T compose(T t);
}
public class PoincareTransform implements Transform<PoincareTransform> {
private Matrix matrix;
public PoincareTransform compose(PoincareTransform t) {
...
}
}
但这并不令人满意,因为从概念上讲,它不是干净,优雅的,并且还会有一些麻烦:PoincareTransform子类现在具有与以前相同的问题。同样,有了这个定义,我在项目中就拥有了泛型!
我在概念上错了吗?我怎样才能构想出这样的结构?
最佳答案
我想我会采用第一个解决方案,但是如果无法从PoincareTransform.transform(Transform t)
中的给定转换中获取矩阵,则会返回错误。
例如:
public class PoincareTransform implements Transform {
private Matrix matrix;
public Transform compose(Transform t) {
if (!t.hasMatrix()) {
// Throw an exception, or some other meaningful error.
}
...
}
}
这样,它是通用的,因此如果您最终使用矩阵进行了另一种变换,则可以使用它。
另一方面,如果您确实只想在PoincareTransforms上进行操作,则可以使用
instanceof
运算符检查传入的实例是否正确。public class PoincareTransform implements Transform {
private Matrix matrix;
public Transform compose(Transform t) {
if (!t instanceof PoincarTransform) {
// Throw an exception, or some other meaningful error.
}
PoincarTransform p = (PoincarTransform)t;
...
}
}