gpt4 book ai didi

Scala 案例类继承

转载 作者:行者123 更新时间:2023-12-03 05:08:04 25 4
gpt4 key购买 nike

我有一个基于 Squeryl 的应用程序。我将模型定义为案例类,主要是因为我发现复制方法很方便。

我有两个严格相关的模型。字段是相同的,很多操作是共同的,并且要存储在同一个DB表中。 但是有一些行为仅在两种情况之一中有意义,或者在两种情况下都有意义但有所不同。

到目前为止,我只使用了一个案例类,带有一个区分模型类型的标志,并且所有基于模型类型而不同的方法都以 if 开头。这很烦人,而且类型不太安全。

我想做的是考虑祖先案例类中的常见行为和字段,并让两个实际模型继承它。但是,据我了解,从案例类继承在 Scala 中是不受欢迎的,如果子类本身就是一个案例类(不是我的案例),甚至会被禁止。

从案例类继承时应该注意哪些问题和陷阱?对于我来说这样做有意义吗?

最佳答案

在没有代码重复的情况下避免案例类继承的首选方法有些明显:创建一个公共(public)(抽象)基类:

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

关于Scala 案例类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12705309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com