我想扩展一个类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)
}
答案 0 :(得分:2)
我不明白这是怎么可能的。抽象函数的想法是强制该函数的实现。你必须给编译器一些东西。
如果您希望ExtMesh
为Mesh
提供丰富的界面,那么惯用的方法就是隐式转换 - 但来自 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
。