Scala mixin与对象

时间:2014-07-15 16:00:02

标签: scala

我有3个交易应该是mixintwo个不同的对象。第一个对象只包含前两个特征,而第二个对象应该包含所有特征。 我不想执行Trait1Trait2的双重初始化,因此可以在第二个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个构造函数。

1 个答案:

答案 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)
}