Scala:使用工厂进行子类化

Scala:使用工厂进行子类化,scala,traits,Scala,Traits,假设我有两个特点,一个是工厂,另一个是工厂: trait BaseT { val name: String def introduceYourself() = println("Hi, I am " +name) // some other members ... } trait BaseTBuilder { def build: BaseT } 现在,我想扩展BaseT: trait ExtendedT extends BaseT { val someNewCoolFie

假设我有两个特点,一个是工厂,另一个是工厂:

trait BaseT {
  val name: String
  def introduceYourself() = println("Hi, I am " +name)
  // some other members ...
}
trait BaseTBuilder {
  def build: BaseT
}
现在,我想扩展BaseT:

trait ExtendedT extends BaseT {
  val someNewCoolField: Int
  override def introduceYourself() = {
    super.introduceYourself()
    println(someNewCoolField)
  }
  // some other extra fields
假设我知道如何初始化新字段,但我想使用BaseTBuilder初始化超类成员。是否有可能创建一个能够以某种方式实例化ExtendedT的特性?这种方法显然失败了:

trait ExtendedTBuilder { self: TBuilder =>
  def build: ExtendedT = {
    val base = self.build()
    val extended = base.asInstanceOf[ExtendedT] // this cannot work
    extended.someNewCoolField = 4  // this cannot work either, assignment to val
    extended
  }
  def buildDifferently: ExtendedT = {
    new ExtendedT(4)  // this fails, we don't know anything about constructors of ExtendedT
  }
  def build3: ExtendedT = {
    self.build() with {someNewCoolField=5} //that would be cool, but it cannot work either
  }
}
我希望有这样一组特性或对象,当有人提供BaseT和BaseTBuilder的具体实现时,我可以通过以下方式实例化ExtendedT:

val extendedBuilder = new ConcreteBaseTBuilder with ExtendedTBuilder
val e: ExtendedT = extendedBuilder.build

ExtendedT可以包含BaseT类型的字段,但是它需要手动代理所有必要的方法和字段,我认为这违反了DRY原则。如何解决这个问题

在ExtendBasteBuilder中创建ExtendBaseT实例怎么样

trait ExtendBaseTBuilder { self : BaseTBuilder =>
  def build: ExtendBaseT = {
    new ExtendBaseT {
      val someNewCoolField: Int = 3
    }
  }

}

这样我们就完全放弃了BaseTBuilder所做的工作,这很糟糕,BaseT可以有BaseTBuilder填充的一些抽象成员。此外,有人可能会说TurboBuilder类使用另一个Builder{def build:BaseT with AnotherT=…}扩展了BaseTBuilder,因此TurboBuilder使用另一个生成器生成BaseT类型的对象。然后,我们希望带有ExtendedTBuilder.build的新TurboBuilder的类型为ExtendedT with AnotherT,这不会发生。