[解決済み] 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
関連
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] Scalaのcase classとclassの違いは何ですか?
-
[解決済み】Scalaでケースクラスのインスタンスをクローンして、1つのフィールドだけを変更するにはどうすればよいですか?
-
[解決済み] IntelliJ Scala Pluginのcase classのインデントが不合理
-
[解決済み] Scala の Case Classes のオーバーロード・コンストラクタ?
-
[解決済み] Scalaです。ScalaのコレクションにおけるTraversableとIterableの違いは何ですか?
-
[解決済み] Scalaでimmutable.Mapをmutable.Mapに変換するにはどうしたらいいですか?
-
[解決済み] Scalaでマップを反転させるエレガントな方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] scalaの列挙を理解する
-
[解決済み] Scalaの配列の初期化
-
[解決済み] Any、AnyVal、AnyRef、Objectの関係と、Javaコードでのマッピングについて教えてください。
-
[解決済み] sbtとGradleの比較 [終了しました]。
-
[解決済み] Scalaのcaseクラスを宣言することのデメリットは何ですか?
-
[解決済み] Scalaでサブアレイを取得する正しい方法は何ですか?
-
[解決済み] Scala型プログラミングリソース
-
[解決済み] Spark ScalaのDataFrameのカラム名のリネーム
-
[解決済み] Scalaで2つ以上のリストをまとめてzipで圧縮することはできますか?
-
[解決済み] Scala で複数の暗黙の引数を持つ関数を定義する