私はScalaにはかなり新しく、APIライブラリを作成し、valと不変オブジェクト(可能な場合)のみを使用しようとしています。私はオブジェクトをモデル化する正しい方法を決定しようとしています。スカラ拡張パラメータ付き抽象クラス
abstract class Post(val id: Int, val name: String, ...)
case class TextPost(val id: Int, val name: String, ..., val text: String) extends Post(id, name, ...)
case class PhotoPost(val id: Int, val name: String, ..., val url: String) extends Post(id, name, ...)
この方法は、多くを扱う場合は特に、繰り返しの宣言とボイラープレートコードの多くを追加しますが、いくつかの「ポスト」のオブジェクトがどのすべての共有いくつかの共通のフィールド、しており、それぞれが独自の特定のフィールドを追加したとポストサブクラスと共有フィールドは、抽象クラスで宣言します。私はそれを見る方法で、これはコンストラクタによってのみ初期化できるvalの使用によって引き起こされます。ここで説明した関係を作成するためのより良い方法がありますか、または不変のオブジェクトだけを使用したい場合にはこれを苦労しなければなりませんか?
ありがとうございます!ボイラー・プレート・コードに関して、このメソッドは基本的に、派生クラスの各パラメーターをvalとして宣言するのを防ぎますが、各宣言ですべてのパラメーターを繰り返す必要があります。私は8つのサブクラスと15の共有フィールドを持っているので、これを強調しています。これは、このような巨大なDRYケースのようです。しかし、私はあなたの答えから、これを回避する方法はない、と理解していますよね? – orrsella
これ以外の唯一の方法は、共通インタフェース( 'Post')を実装することではありません。つまり、型を含める必要があることを意味しますが、それがあなたの望むものなのかどうかはわかりません: 'case class Post(id:Int、name:String);大文字小文字のクラスTextPost(投稿:投稿、テキスト:文字列) '。 –
ボイラープレートの質問に答えることができないので、この答えは十分ではないと思います... –