1

我想完成一些与标准 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
}

我希望能够编写一个函数来计算字段名称myxmyy然后使用特征将它们混合到类中。这是我想做的一些虚构的伪Scala:

def addMy(cls: Class) {
    newFields = cls.fields.map( f => createField("my" + f.name, f.type) )
    myTrait = createTrait(newFields)
    extendClass(cls, myTrait)
}
4

1 回答 1

0

我能想到的实现这种行为的最简单方法是使用 Scala 2.10 的动态特性。因此,Point必须扩展Dynamic,您可以通过将计算逻辑添加到成员函数selectDynamicupdateDynamic. 这并不是“混合”实际所指的内容,但它仍然允许您动态添加功能。

为了确保可以检查是否混合了特定功能,您可以使用以下约定。为了检查一个字段是否混入,用户可以调用hasMyxhas...一般。默认情况下,您的实现返回false. 每次混入一个新字段时,相应的has...函数都会返回true

请注意,您所有混合字段的返回类型将是Any(除非您的所有字段都属于同一类型,请参见例如这个问题)。我目前认为无法避免这种设计的大量铸造。

于 2013-02-20T08:56:37.760 回答