我想完成与标准mixin略有不同的事情。我想构建一个特征,其新字段是根据它扩展的类(或特征)的字段计算的。
例如,如果我有这样的课程:
class Point {
var x: Int = 0
var y: Int = 0
}
我想创建一个这样的类:
class Point' {
var x: Int = 0
var y: Int = 0
var myx: Int = 0
var myy: Int = 0
}
我希望能够编写一个计算字段名myx
和myy
的函数,然后使用特征将它们混合到类中。这里有一些psuedo-Scala用于我想做的事情:
def addMy(cls: Class) {
newFields = cls.fields.map( f => createField("my" + f.name, f.type) )
myTrait = createTrait(newFields)
extendClass(cls, myTrait)
}
答案 0 :(得分:0)
我能想到实现这种行为的最简单方法是使用Scala 2.10的Dynamic功能。因此,Point
必须扩展Dynamic
,您可以通过将计算逻辑添加到成员函数selectDynamic
和updateDynamic
来“混合”任意字段。这并不是“混合”实际上指的是什么,但它允许您动态添加功能。
为确保可以检查特定功能是否已混合,您可以使用以下约定。为了检查字段是否混入,用户通常可以呼叫hasMyx
或has...
。默认情况下,您的实现返回false
。每次混合使用新字段时,相应的has...
函数都会返回true
。
请注意,所有混合字段的返回类型将为Any
(除非您的所有字段属于同一类型,请参阅this question)。我目前认为没有办法避免使用这种设计进行大量的投射。