правильная иерархия классов для 2D и 3D векторов

Я хочу иметь общий векторный абстрактный класс / черту, который определяет определенные методы, например:

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?

5
задан dsg 23 January 2011 в 11:46
поделиться