【发布时间】:2012-12-01 00:39:32
【问题描述】:
我正在考虑以下 Scala 类布局。我有一个代表项目的基本特征 - 一个应该是不可变对象的接口,我们可以通过调用 equip 之类的方法来查询名称、重量和做一些特定于对象的事情:
trait Item {
def name: String
def weight: Int
def equip // ... more abstract methods
}
我可以创建 Item 实现,手动创建案例类,但我想要某种基于“字典”的项目 - 即静态映射包含从类型 ID 到值的映射,name 和weight 方法只需使用存储的类型 ID 查询字典:
object Weapon {
final val NameDict = Map(1 -> "short sword", 2 -> "long sword")
final val WeightDict = Map(1 -> 15, 2 -> 30)
}
case class Weapon(typ: Int) extends Item {
import Weapon._
def name = NameDict(typ)
def weight = WeightDict(typ)
def equip = ... // implementation for weapon
}
到目前为止,一切都很好。我可以使用Weapon(1) 来引用“短剑”的项目对象。但是,相同的基本原理适用于任何其他项目类型,例如Armor,它使用完全相同的name 和weight 实现,但完全不同的equip 和其他抽象方法实现,例如:
object Armor {
final val NameDict = Map(3 -> "bronze armor", 4 -> "iron armor")
final val WeightDict = Map(3 -> 100, 4 -> 200)
}
case class Armor(typ: Int) extends Item {
import Armor._
def name = NameDict(typ)
def weight = WeightDict(typ)
def equip = ... // implementation for armor
}
看起来很像Weapon,不是吗?我想以类似的方式分解出常见的模式(即在伴随对象字典和常见的typ 值中实现查找):
abstract class DictionaryItem(typ: Int) extends Item {
def name = ???.NameDict(typ)
def weight = ???.WeightDict(typ)
}
object Weapon {
final val NameDict = Map(1 -> "sword", 2 -> "bow")
final val WeightDict = Map(1 -> 15, 2 -> 30)
}
case class Weapon(typ: Int) extends DictionaryItem(typ) {
def equip = ... // implementation for weapon
}
但是如何从父类中引用子类的伴随对象(如Weapon.NameDict)——即我应该使用什么来代替???.NameDict(typ),以及如何向编译器解释子类的伴随对象必须包含这些字典?有没有更好、更 Scala 风格的方法来解决此类问题?
【问题讨论】:
-
也许这是一个相关的问题,你想看看stackoverflow.com/questions/12179092/…
-
谢谢,凯恩!它是相关的,是的。
标签: class scala case-class companion-object