我可以在Scala中动态构造一个基于它扩展的类计算的特征吗?

时间:2013-02-20 02:09:30

标签: class scala mixins traits

我想完成与标准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的函数,然后使用特征将它们混合到类中。这里有一些psuedo-Scala用于我想做的事情:

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

1 个答案:

答案 0 :(得分:0)

我能想到实现这种行为的最简单方法是使用Scala 2.10的Dynamic功能。因此,Point必须扩展Dynamic,您可以通过将计算逻辑添加到成员函数selectDynamicupdateDynamic来“混合”任意字段。这并不是“混合”实际上指的是什么,但它允许您动态添加功能。

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

请注意,所有混合字段的返回类型将为Any(除非您的所有字段属于同一类型,请参阅this question)。我目前认为没有办法避免使用这种设计进行大量的投射。