1. ホーム
  2. scala

[解決済み] Scalaの場合 クラス継承

2023-02-20 14:17:28

質問

Squerylをベースにしたアプリケーションを持っています。私はモデルをケースクラスとして定義していますが、これはコピーメソッドを持つことが便利だと思うからです。

私は厳密に関連した2つのモデルを持っています。フィールドは同じで、多くの操作は共通で、それらは同じDBテーブルに保存されます。 しかし には、2つのケースのうちの1つでしか意味をなさない、あるいは両方のケースで意味をなすが異なる、いくつかの動作が存在します。

今まで私は、モデルの型を区別するフラグを持つ単一のケースクラスのみを使用し、モデルの型に基づいて異なるすべてのメソッドは、ifで始まります。これは迷惑なことで、タイプセーフではありません。

私がやりたいことは、共通の動作とフィールドを祖先のケースクラスに因数分解し、2つの実際のモデルをそこから継承させることです。しかし、私が理解する限り、Scalaではケースクラスからの継承は嫌われ、サブクラスがそれ自体ケースクラスである場合(私のケースではない)にはさらに禁止されています。

caseクラスを継承する際に注意すべき問題や落とし穴は何でしょうか?私の場合、そうすることは意味があるのでしょうか?

どのように解決するのですか?

コードを重複させずにケースクラスの継承を避けるための私の好ましい方法は、共通の(抽象)ベースクラスを作成するという、やや明白なものです。

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