Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 我可以在Scala中动态构造一个基于它扩展的类计算的特征吗?_Class_Scala_Mixins_Traits - Fatal编程技术网

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

Class 我可以在Scala中动态构造一个基于它扩展的类计算的特征吗?,class,scala,mixins,traits,Class,Scala,Mixins,Traits,我想完成一些与标准混音稍有不同的事情。我想构造一个trait,它的新字段是基于它扩展的类(或trait)的字段计算的 例如,如果我有一个这样的类: 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 } 我想制作一个这样的课程: class Poin

我想完成一些与标准混音稍有不同的事情。我想构造一个trait,它的新字段是基于它扩展的类(或trait)的字段计算的

例如,如果我有一个这样的类:

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
}
我想制作一个这样的课程:

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
,然后使用trait将它们混合到类中。以下是我想做的一些虚构的psuedo Scala:

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

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

为了确保能够检查是否混合了特定功能,例如,您可以使用以下约定。为了检查字段是否混入,用户通常可以调用
hasMyx
has…
。默认情况下,您的实现返回
false
。每次混入新字段时,相应的
具有…
函数将返回
true


请注意,所有混合输入字段的返回类型将为
Any
(除非所有字段的类型相同,请参见示例)。我目前认为没有办法避免使用这种设计进行大量铸造。

为什么要这样做?访问这些元素的唯一方法是通过反射,反射似乎比更明显的替代方法(例如,某种名称/值映射)更有效,不是吗?对于宏,一切都是可能的。。。我想。。。不幸的是,现在还不可能通过宏AFAK之外的可用宏来创建类(或特征)。至少使用Scala 2.10。另一种方法是创建一个实现(纯)特征的对象。那么不管怎样,你能给我们举个例子,为什么这种行为会有用?@cheeken,为什么我只能通过反射来访问添加的元素?我是否可以创建一个新类的实例并访问
instance.myx
?@michael\s,如果我正在编写ORM,这种模式将非常有用。我可以允许用户创建一个与另一个模型有关系的类(表示某个数据模型)。然后我可以向类中添加字段来表示相关模型的字段。