我有3个交易应该是mixin
到two
个不同的对象。第一个对象只包含前两个特征,而第二个对象应该包含所有特征。
我不想执行Trait1
和Trait2
的双重初始化,因此可以在第二个mixin中使用第一个对象实例,如下所示:
trait T1 {
def m11
def m12
def m13
}
trait T2 {
def m21
def m22
def m23
}
def par = new T1 with T2 {
def m11 = new M11Class()
def m12 = new M12Class()
def m13 = new M13Class()
def m21 = new M21Class()
def m22 = new M22Class()
def m23 = new M23Class()
}
def child = new T1 with T2 with TraitChild {
def m11 = new M11Class()
def m12 = new M12Class()
def m13 = new M13Class()
def m21 = new M21Class()
def m22 = new M22Class()
def m23 = new M23Class()
/*init 3*/
}
我想:
def child = par with TraitChild { /*init 3 only*/ }
一般来说: 我不想两次调用我的6个构造函数。
答案 0 :(得分:1)
您可以使用要在多个对象上“橡皮图章”的实现来定义类或特征:
trait Stamp extends T1 with T2 {
def m11 = new M11Class()
def m12 = new M12Class()
/* ... */
}
val par = new Stamp { }
val child = new Stamp with TraitChild {
/* define implementation for TraitChild */
}
在此示例中,如果您将Stamp
作为一个类而不是一个特征,则可以使用par
创建new Stamp
。
您甚至可以在戳记特征中使用局部变量,这样即使在不同对象上调用时,方法也会返回与值相同的对象:
def createObjects(): (T1 with T2, T1 with T2 with TraitChild) = {
val x11 = new M11Class()
val x12 = new M12Class()
/* ... */
trait Stamp extends T1 with T2 {
def m11 = x11
def m12 = x12
/* ... */
}
val par = new Stamp { }
val child = new Stamp with TraitChild {
/* define implementation for TraitChild */
}
(par, child)
}