我正在开发一个适合我的需求的线性代数库。目前我有两个想法,但我想知道这两种结构的优缺点是什么,以便做出正确的选择。
例如 vector :
//First structure (simple inheritance using generics
//to prevent instanceof and casting in subclasses
public abstract class AbstractVector<T>{
public abstract T method(T t){...}
...
}
public class Vector2 extends AbstractVector<Vector2>{
public Vector2(){...}
//Implements AbstractVector method, generic T is Vector2
public Vector2 method(Vector2 vector){...}
}
public class Vector3 extends AbstractVector<Vector3>{...}
public class Vector4 extends AbstractVector<Vector4>{...}
//Second structure (using the structure of java AbstractList/List/ArrayList
//prevents instanceof and casting in subclasses )
public interface Vector<T>{
T method(T t){...}
}
public abstract class AbstractVector<T> implements Vector<T>{...}
public class Vector2 extends AbstractVector<Vector2>{
public Vector2(){...}
//Implements Vector interface method, generic T is Vector2
public Vector2 method(Vector2 vector){...}
}
public class Vector3 extends AbstractVector<Vector3>{...}
public class Vector4 extends AbstractVector<Vector4>{...}
在使用方面:
//1st structure
Vector2 vector2 = new Vector2();
Vector3 vector3 = new Vector3();
vector2.method(vector3) //Compile time error!
//2nd structure (I use Vector type main advantage of interface)
Vector vector2 = new Vector2();
Vector vector3 = new Vector3();
vector2.method(vector3) //Runtime error!
目前我有以下优点和缺点:
- 对于第一个结构:
优点:简单的继承和编译时错误 - 对于第二个结构:
优点:此结构插入通用类型Vector
缺点:只有运行时错误
我是否错过了使一种结构胜过另一种结构的优点/缺点?
编辑:该库的主要目的是将其用于几何定义和 openGL 渲染。
最佳答案
拥有 Set
接口(interface)和单独的实现类 HashSet
、TreeSet
的原因非常巧妙。 它使所有代码尽可能通用,并保持继承简单。它允许将来扩展 API,并具有向后兼容性(对于其他类)。
还有一个问题是,Set
具有一项特殊功能:扩展 Set
的 SortedSet
接口(interface),并且仅由 实现>树集
。
interface Vector {
}
class SparseVector implements Vector {
}
class UnitVector implements Vector {
}
<小时/>
interface IonicalVector extends Vector {
IonicalVector rotate(double phi);
}
class QuatrionsVector implements IonicalVector {
@Override
public IonicalVector rotate(double phi) { ... }
}
<小时/>
缺点是 LinkedList
中 get(int index)
的开销不适合它。
就我个人而言,我会继续使用简单的类,当可以想到不同的实现时,看看什么是有意义的。
请注意,您还可以使用 builder pattern通过动态选择(私有(private))实现来实现一个接口(interface)。有点像Arrays.asList
。
Vector v = Vector.with().dim(4).quatrionic(true).build();
关于java - 通用接口(interface)或通用子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938731/