Class 我可以在Scala中动态构造一个基于它扩展的类计算的特征吗?
我想完成一些与标准混音稍有不同的事情。我想构造一个trait,它的新字段是基于它扩展的类(或trait)的字段计算的 例如,如果我有一个这样的类: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
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,这种模式将非常有用。我可以允许用户创建一个与另一个模型有关系的类(表示某个数据模型)。然后我可以向类中添加字段来表示相关模型的字段。