使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?
Posted
技术标签:
【中文标题】使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?【英文标题】:WIth Squeryl (using Lift), how can I make two model classes a subclass of the same class? 【发布时间】:2015-05-07 13:32:53 【问题描述】:在 Squeryl 中使用 Lift,我怎样才能使两个类成为同一个类的子类?
我的课程如下所示:
class SubClass1 extends Record[SubClass1] with KeyedRecord[SubClass1] with CreatedUpdated[SubClass1]
val id = ...
val field1a = StringField(...)
...
class SubClass2 extends Record[SubClass2] with KeyedRecord[SubClass2] with CreatedUpdated[SubClass2]
val id = ...
val field2a = StringField(...)
我希望 SubClass1
和 SubClass2
分别成为其他类的子类,例如 MyParentClass。所以我认为我必须做这样的事情:
abstract class MyParentClass extends Record[MyParentClass] with KeyedRecord[MyParentClass] with CreatedUpdated[MyParentClass]
然后
class SubClass1 extends MyParentClass
val id = ...
val field1a = StringField(...)
...
class SubClass2 extends MyParentClass
val id = ...
val field2a = StringField(...)
...
这给了我错误,例如字段 (StringField
) 等不符合正确的类型。有关如何执行此操作的任何建议?
谢谢,
【问题讨论】:
【参考方案1】:你的抽象超类不能定义一个具体的类型参数,因为它需要被子类覆盖。试试:
abstract class MyParentClass[A <: MyParentClass]
extends Record[A] with KeyedRecord[A] with CreatedUpdated[A]
然后:
class SubClass extends MyParentClass[SubClass]
【讨论】:
您好戴夫,非常感谢您的回复。我最终选择了一个与您的解决方案非常相似的解决方案:trait MyParentClass[A <: Record[A]] extends Record[A] with KeyedRecord[A] with CreatedUpdated[A] self: A => class MySubClass extends MyParentClass[MySubClass] ...
以上是关于使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 Squeryl 插入时出现 ClassCastException
包含greaterThanEqual(gte)或lessThanEqual(lte)的Squeryl查询给出错误/无结果