2016-09-13 18 views
1

objecttraitabstract class、まれにはcase classを使って何かを作ることができるようです。これのほとんどはobject extends traitの形式です。だから、もし私がいつも平野の標準classを使うべきかどうか疑問に思っていますか?いつScalaで通常のクラスを使うべきですか?

+0

Martin Oderskyは実際には、Scalaにはメソッド、型メンバー、型の投影、パス、オブジェクト、および特性が必要だと言っています。基本的にプラットフォームの相互運用性のためだけに他のすべてがあります。しかし、他のすべてのものはそこにあるので、帽子は他のものよりも使用するのが賢明であることがあります。 IOWは、クラスと特性*が重なっていても、両方のユースケースが異なっています。 –

答えて

1

これは、あなたが新しいScala

Classいるよう

が見えるこの質問をするために適切な場所ではありませんが、あなたがモデルにしたい何か(一部のエンティティ)のための仕様です。これは、継承のために使用されているキーワードclass

両方traitabstract classを使用して、いわゆる通常のクラスを宣言するための唯一の方法がある行動や状態

が含まれています。

traitは、継承のために使用されます(通常、共通の動作をそこに入れます)。 traitはJavaのインタフェースに似ています。形質で可能な多重継承はあるが、abstract classではない。

クラスは1つのクラスまたは抽象クラスを拡張できますが、任意の数の特性を組み込むことができます。形質は行動や状態を持つことができます。

case classはクラスだけですが、コンパイラは、わかりやすく見栄えの良い定型コードを生成します。

objectは、クラスを宣言したいが、JVM内でクラスのインスタンスを1つしか持たない(シングルトンパターンを覚えている)場合に使用されます。

+0

これはなぜこの質問をするのに適切な場所ではありませんか? –

+1

@AlvaroCarrascoこの質問は、基本的な概念の説明が必要です。回答は、できる限り長く(主観的)、何の制限もありません。あなたがすでに試して助けが必要なコード関連の問題については、Stackoverflowの方が多くあります。主観的な概念に関連する質問のための他のフォーラムがあります。 stackoverflow質問ルールについて読む。 – pamu

1

オブジェクトがそのメンバー上でステートフルな計算を実行する場合、そのメンバーはvarsで宣言されます。

また、そのメンバーがvalで宣言されているにもかかわらず、それらのvalに変更可能なデータ構造が格納されている場合でも、Java可変オブジェクトに似た通常の(変更可能な)クラスである必要があります。

ScalaでCaseクラスを使用する慣習的な方法は、不変型です。つまり、すべてのコンストラクタ引数はvalです。 varsを使うこともできますが、等価比較が時間の経過とともに壊れるようなケースクラスの利点は失われます。行動がそれ具体的なクラス作り、その後、再利用されない場合

:特性、抽象クラスと具象クラスを使用して間で決定する上Odersky著らによるProgramming in Scalaから

いくつかのアドバイス。結局のところ、再利用可能な行動ではありません。

複数の関連しないクラスで再利用される可能性がある場合は、それを特性にしてください。 クラス階層の異なる部分に特性を混在させることができます。

Javaコードで継承したい場合は、抽象クラスを使用します。 コードを持つ形質には近いJava類似型がないため、Javaクラスの形質から継承するのは難しいです( )。一方 から継承Scalaクラスは、Javaクラスを継承するようなものです。 抽象メンバのみを持つScalaの特性は、 をJavaインターフェイスに直接変換するため、Javaコードが継承されると予想される場合でも、このような の特性を自由に定義する必要があります。 JavaとScalaの併用についての詳細は、第29章 を参照してください。

コンパイル済みの形式で配布する予定で、グループ外に グループが継承しているクラスを作成すると予想される場合は、抽象クラスを使用して に向かって傾けます。問題は、特性が のメンバーを取得または失うときに、 が変更されていなくても、それを継承するクラスを再コンパイルする必要があることです。外部のクライアントが の振る舞いを呼び出すのではなく、その振る舞いを継承するのではなく、その特性を使うのがいいです。

効率が非常に重要な場合は、クラスを使用してください。ほとんどのJava ランタイムは、インターフェイスメソッドの呼び出しよりも速く、クラスメンバーの仮想メソッド呼び出しを 操作にします。特性は インターフェイスにコンパイルされるため、わずかなパフォーマンスオーバーヘッドが発生する可能性があります。 ただし、この種の形質は がパフォーマンスのボトルネックになっていることがわかっていて、その代わりに実際に問題を解決するという証拠がある場合は、この選択を行う必要があります。

まだわからない場合は、上記を考慮してから、 で始まります。 はいつでも後で変更することができ、一般的には特性を使用してさらに多くのオプションを開くことができます。

関連する問題