我有一个基于 Squeryl 的应用程序。我将模型定义为案例类,主要是因为我发现复制方法很方便。
我有两个严格相关的模型。字段是相同的,很多操作是共同的,并且要存储在同一个DB表中。But有些行为仅在两种情况之一中有意义,或者在两种情况下都有意义但有所不同。
到目前为止,我只使用了一个案例类,带有一个区分模型类型的标志,并且所有基于模型类型而不同的方法都以 if 开头。这很烦人,而且类型不太安全。
我想做的是考虑祖先案例类中的常见行为和字段,并让两个实际模型继承它。但是,据我了解,从案例类继承在 Scala 中是不受欢迎的,如果子类本身就是案例类(不是我的案例),甚至会被禁止。
从案例类继承时应该注意哪些问题和陷阱?对于我的情况来说这样做有意义吗?
我在没有代码重复的情况下避免案例类继承的首选方法有些明显:创建一个公共(抽象)基类:
abstract class Person {
def name: String
def age: Int
// address and other properties
// methods (ideally only accessors since it is a case class)
}
case class Employer(val name: String, val age: Int, val taxno: Int)
extends Person
case class Employee(val name: String, val age: Int, val salary: Int)
extends Person
如果您想要更细粒度,请将属性分组为单独的特征:
trait Identifiable { def name: String }
trait Locatable { def address: String }
// trait Ages { def age: Int }
case class Employer(val name: String, val address: String, val taxno: Int)
extends Identifiable
with Locatable
case class Employee(val name: String, val address: String, val salary: Int)
extends Identifiable
with Locatable
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)