1. 序章

Scalaは、特性を備えたデータ構造を設計するための幅広い機会を開発者に提供します。 最も重要な機能の1つは、特性拡張とミックスインを備えたクラス構成です。

2. 特性でクラスを充実させる

車などのエンティティを表す単純なクラスの設計を検討してください。 一般的なエンティティを提示するために、特性を使用できます。

trait Car {
 def model: String
 def horsePower: Int
}

次に、より具体的なエンティティを構築します。

class BMW(val model: String, val horsePower: Int) extends Car

このようにして、 BMW クラスのインスタンスは、Car特性のフィールドを実装します。

val bmw = new BMW("F15", 309)
bmw.model // F15
bmw.horsePower // 309

ここで、CarインスタンスのJSONビューも提供するオプションを提供したいとします。 Scalaは、特性ミックスインを介してクラスを強化するためのツールを提供します。 このアプローチでは、通常、クラスのコードを変更する必要はありません。

ある特性からクラスを拡張したら、それを別の特性と混合することができます。 この場合、関連する特性(たとえば、 Marshaller )をクラスに混ぜるだけで十分です。 この新しい特性は、 Car 特性を拡張し、そのフィールドmodelおよびhorsePowerにアクセスできます。

trait Marshaller extends Car {
  def toJson: String = s"{${"\"model\""}:$model," +
    s"\n${"\"horsePower\""}:$horsePower}"
}

ここで、 BMW クラスのインスタンスでJSONを出力できるようにする場合は、 with キーワードを使用して、作成時にMarshaller特性を組み合わせることができます。それ:

val bmwWithJson = new BMW("F15", 309) with Marshaller

また、新しいインスタンスでtoJsonメソッドを呼び出すことができます。

val jsonView = bmwWithJson.toJson // {"model":F15,\n"horsePower":309}

3. 結論

この記事では、Scalaの特性を備えたクラス構成の概要を説明しました。 ミックスインには、セルフタイプの使用、初期化の順序、スタック可能な変更と特性、ケーキパターンなど、他にもいくつかの側面があります。 ]ですが、モジュール式で構成可能なデータ構造を設計するための特性構成の力はすでに見てきました。

いつものように、これらの例はGitHubから入手できます。