相关疑难解决方法(0)

define方法返回扩展它的类的类型

我希望能够做到这样的事情:

trait A {
  def f(): ???_THE_EXTENDING CLASS
}
class C extends A {
  def f() = self
}
class D extends A {
  def f() = new D
}
class Z extends D {
  def f() = new Z
}
Run Code Online (Sandbox Code Playgroud)

鉴于上述代码,以下内容无法编译

class Bad1 extends A {
  def f() = "unrelated string"
}
class Bad2 extends A {
  def f() = new C // this means that you can't just define a type parameter on
                  // A like A[T <: …
Run Code Online (Sandbox Code Playgroud)

types scala

22
推荐指数
3
解决办法
8170
查看次数

适用于2D和3D矢量的类层次结构

我想要一个通用的矢量抽象类/特征来指定某些方法,例如:

trait Vec 
{
  def +(v:Vec):Vec
  def *(d:Double):Vec

  def dot(v:Vec):Double
  def norm:Double
}
Run Code Online (Sandbox Code Playgroud)

我想拥有Vec2DVec3D扩展Vec:

class Vec2D extends Vec { /* implementation */ }
class Vec3D extends Vec { /* implementation */ }
Run Code Online (Sandbox Code Playgroud)

但是,我怎样才能使它Vec2D只能被添加到其他Vec2D而不是Vec3D

现在我只是实现Vec2D并且Vec3D没有共同的Vec祖先,但是重复代码变得乏味.我要实现依赖于这些类中的所有我的几何类(如Triangle,Polygon,Mesh,...)两次,一次Vec2D又一次的Vec3D.

我看到了java实现:javax.vecmath.Vector2djavax.vecmath.Vector3d没有共同的祖先.这是什么原因?有没有办法在scala中克服它?

architecture oop scala hierarchy

5
推荐指数
2
解决办法
478
查看次数

scala self-type:类型参数错误的成员

这是这个问题的后续内容.

为什么这段代码无法编译,我该如何解决?

trait Vec[V] { self:V =>
  def -(v:V):V
  def dot(v:V):Double

  def norm:Double = math.sqrt(this dot this)
  def dist(v:V):Double = (this - v).norm
}
Run Code Online (Sandbox Code Playgroud)

错误是:

Vec.scala:6: error: value norm is not a member of type parameter V
  def dist(v:V):V = (this - v).norm
                               ^
Run Code Online (Sandbox Code Playgroud)

scala self-type

2
推荐指数
1
解决办法
680
查看次数

标签 统计

scala ×3

architecture ×1

hierarchy ×1

oop ×1

self-type ×1

types ×1