与工厂一起使用特征

Mr_*_*Qqn 6 factory scala traits

我目前正在发现scala,我想知道我是否可以使用工厂的特性.

我试过这个:

abstract class Foo {
  ...
}
object Foo {
  def apply() = new Bar

  private class Bar extends Foo {
    ...
  }
}

Foo() with MyTrait // Not working

我想这是因为with必须先于new.

有没有办法做到这一点?

谢谢

oll*_*erg 4

不,已经太晚了,当 apply() 方法返回时实例已经创建了。

您可以做的是使用工厂方法内的特征。下面的代码来自我正在编写的一个相当大的代码示例:

object Avatar {
 // Avatar factory method
 def apply(name: String, race: RaceType.Value, character: CharacterType.Value
  ): Avatar = {
    race match {
      case RaceType.Dwarf => {
        character match {
          case CharacterType.Thief => new Avatar(name) with Dwarf with Thief
          case CharacterType.Warrior => new Avatar(name) with Dwarf with Warrior
          case CharacterType.Wizard => new Avatar(name) with Dwarf with Wizard
        }
      }
      case RaceType.Elf => {
        character match {
          case CharacterType.Thief => new Avatar(name) with Elf with Thief
          case CharacterType.Warrior => new Avatar(name) with Elf with Warrior
          case CharacterType.Wizard => new Avatar(name) with Elf with Wizard
        }
      }
    }
  }
}

class Avatar(val name: String) extends Character {
  ...
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,您的 Avatar 的类型(职业和种族)是在工厂中根据 RaceType 和 CharacterType 枚举决定的。您拥有的是一家工厂,可生产各种不同类型或类型组合。

  • @Ken我想看看这样的代理的代码示例。您能否通过一个示例向该主题添加新的响应? (3认同)
  • @Mr_Qqn:不,你不能这样做,甚至不能通过传递清单。如果您需要这种行为,请计划创建将特定特征代理到工厂创建的对象的代理,并为创建必要代理的那些特征创建(隐式)转换。 (2认同)