java - 通用接口(interface)或通用子类

标签 java inheritance interface

我正在开发一个适合我的需求的线性代数库。目前我有两个想法,但我想知道这两种结构的优缺点是什么,以便做出正确的选择。

例如 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!

目前我有以下优点和缺点:

  1. 对于第一个结构:
    优点:简单的继承和编译时错误
  2. 对于第二个结构:
    优点:此结构插入通用类型 Vector
    缺点:只有运行时错误

我是否错过了使一种结构胜过另一种结构的优点/缺点?

编辑:该库的主要目的是将其用于几何定义和 openGL 渲染。

最佳答案

拥有 Set 接口(interface)和单独的实现类 HashSetTreeSet 的原因非常巧妙。 它使所有代码尽可能通用,并保持继承简单。它允许将来扩展 API,并具有向后兼容性(对于其他类)。

还有一个问题是,Set 具有一项特殊功能:扩展 SetSortedSet 接口(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) { ... }
}
<小时/>

缺点是 LinkedListget(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/

相关文章:

javascript - 如何检查一个 Javascript 类是否继承了另一个类(不创建对象)?

c# - 重构两个方法以使用接口(interface)和/或泛型

java - JFrame 上的 Enter 键

java - AuditingEntityListener junit 找不到上下文

关于创建新局部变量以引用类成员变量的 Java 编码风格

c# - 接口(interface) "not marked with serializable attribute"异常

c# - 项目从VS2010迁移到VS2012后无法继承接口(interface)

java - 如何在 MongoDB 的 application.properties 中设置等待队列倍数和最大池大小

inheritance - Dart:继承和 super 构造函数

c++ - VTK继承问题