将接口实现委托给成员

时间:2014-09-17 14:33:32

标签: scala inheritance

我想扩展一个类Mesh,我宁愿不为此使用继承,而是使用成员(我希望这样,因为我已经有许多派生自Mesh的类)。我想delegate大多数(也许是所有?)成员函数到原始实现。我可以一个一个地明确地重定向它们,但也许有一些更简洁的方法?至少我想避免重复函数的参数列表。

或者从ExtMesh到Mesh的隐式转换可以处理" old"界面(不使用extend Mesh),允许我只添加新功能?

abstract class Mesh {
  def Func1(a:Int, b:Float, c:String) : Unit
  def Func2(a:Float, b:Float, c:Int) : Int
}


class ExtMesh extends Mesh {
  Mesh mesh
  def Func1(a:Int, b:Float, c:String) = mesh.Func1(a, b, c)
  def Func2(a:Float, b:Float, c:Int) = mesh.Func2(a, b, c)

  def ExtFunc3(a:String, b:Float)
}

3 个答案:

答案 0 :(得分:2)

我不明白这是怎么可能的。抽象函数的想法是强制该函数的实现。你必须给编译器一些东西。

如果您希望ExtMeshMesh提供丰富的界面,那么惯用的方法就是隐式转换 - 但来自 Mesh ExtMesh

也许你应该稍微扩展一下这个问题,以显示你的实际问题。你不想写几个包装函数有点怀疑。抽象成员的数量是多少?您是否可以将抽象类实现为特征,只使用少量抽象函数并重用它们来完全实现其他成员?

答案 1 :(得分:0)

Scala中的委派可以使用宏来完成。看到 Automatic generation of delegate methods with Macro Annotations

另一种选择是使用自我类型的扩展特征,如Real delegation in Scala

所示
trait ExtMesh { this : Mesh =>
  def ExtFunc3(a:String, b:Float)
}

val extMesh = new Mesh with ExtMesh

答案 2 :(得分:0)

  

或者从ExtMesh到Mesh的隐式转换可以处理" old"接口(不使用扩展网格),允许我只添加新功能?

我同时学到了这很容易,因为可以在伴侣对象中提供隐式转换:

class ExtMesh {
  Mesh mesh

  def ExtFunc3(a:String, b:Float)
}

object ExtMesh {
  implicit def toMesh(ext:ExtMesh): Mesh = ext.mesh
}

这使我可以在Mesh对象上调用ExtMesh的函数,或者使用ExtMesh预期Mesh