Я хочу иметь общий векторный абстрактный класс / черту, который определяет определенные методы, например:
trait Vec
{
def +(v:Vec):Vec
def *(d:Double):Vec
def dot(v:Vec):Double
def norm:Double
}
Я хочу, чтобы Vec2D
и Vec3D
расширяли Vec
:
class Vec2D extends Vec { /* implementation */ }
class Vec3D extends Vec { /* implementation */ }
Но как я могу, например, сделать так, чтобы Vec2D
можно было добавлять только к другим Vec2D
, а не к Vec3D
?
Сейчас я просто реализую Vec2D
и Vec3D
без общего предка Vec
, но это становится утомительно с дублированием кода. Мне нужно реализовать все мои классы геометрии, которые зависят от этих классов (например, Треугольник
, Многоугольник
, Сетка
, ...) дважды, один раз для Vec2D
и еще раз для Vec3D
.
Я вижу реализации java: javax.vecmath.Vector2d
и javax.vecmath.Vector3d
не имеют общего предка. В чем причина этого? Есть ли способ преодолеть это в scala?