从类型参数派生类泛型的替代解决方案

时间:2014-08-15 13:02:01

标签: scala generics

我想创建一个泛型,允许我重用一些函数用于mutliple类。理想情况下,我的设计是:

class ColoredMesh[T <: Mesh] extends T
{
  def Color(color:ColorRGBA) = {
    val vertices = super.getVertexCount
    // do something
  }
}

class ColoredSphere extends ColoredMesh[Sphere]

class ColoredCylinder extends ColoredMesh[Cylinder]

但是,这会产生编译错误:

  

错误:(7,38)需要类类型,但发现T

     

class ColoredMesh [T&lt;:Mesh]扩展T

由于技术原因,类似的Java问题Generic class to derive from its generic type parameter导致从泛型类型参数派生的答案是不可能的。我想这也适用于Scala。还有其他一些常见的设计模式如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用特征和混合成分:

trait ColoredMesh extends Mesh {
  def Color(color:ColorRGBA) = {
    val vertices = super.getVertexCount
    // do something
  }
}

class ColoredSphere extends Sphere with ColoredMesh

答案 1 :(得分:1)

您可以使用自我类型定义trait

trait Colored { self: Mesh =>
    def Color(color: ColorRGBA) = {
        self.getVertexCount
        //do something
    }
}

class ColoredSphere extends Sphere with Colored