object
、trait
、abstract class
、まれにはcase class
を使って何かを作ることができるようです。これのほとんどはobject extends trait
の形式です。だから、もし私がいつも平野の標準class
を使うべきかどうか疑問に思っていますか?いつScalaで通常のクラスを使うべきですか?
答えて
これは、あなたが新しいScala
Class
いるよう
が見えるこの質問をするために適切な場所ではありませんが、あなたがモデルにしたい何か(一部のエンティティ)のための仕様です。これは、継承のために使用されているキーワードclass
両方trait
とabstract class
を使用して、いわゆる通常のクラスを宣言するための唯一の方法がある行動や状態
が含まれています。
trait
は、継承のために使用されます(通常、共通の動作をそこに入れます)。 trait
はJavaのインタフェースに似ています。形質で可能な多重継承はあるが、abstract class
ではない。
クラスは1つのクラスまたは抽象クラスを拡張できますが、任意の数の特性を組み込むことができます。形質は行動や状態を持つことができます。
case class
はクラスだけですが、コンパイラは、わかりやすく見栄えの良い定型コードを生成します。
object
は、クラスを宣言したいが、JVM内でクラスのインスタンスを1つしか持たない(シングルトンパターンを覚えている)場合に使用されます。
これはなぜこの質問をするのに適切な場所ではありませんか? –
@AlvaroCarrascoこの質問は、基本的な概念の説明が必要です。回答は、できる限り長く(主観的)、何の制限もありません。あなたがすでに試して助けが必要なコード関連の問題については、Stackoverflowの方が多くあります。主観的な概念に関連する質問のための他のフォーラムがあります。 stackoverflow質問ルールについて読む。 – pamu
オブジェクトがそのメンバー上でステートフルな計算を実行する場合、そのメンバーはvarsで宣言されます。
また、そのメンバーがvalで宣言されているにもかかわらず、それらのvalに変更可能なデータ構造が格納されている場合でも、Java可変オブジェクトに似た通常の(変更可能な)クラスである必要があります。
ScalaでCaseクラスを使用する慣習的な方法は、不変型です。つまり、すべてのコンストラクタ引数はvalです。 varsを使うこともできますが、等価比較が時間の経過とともに壊れるようなケースクラスの利点は失われます。行動がそれ具体的なクラス作り、その後、再利用されない場合
:特性、抽象クラスと具象クラスを使用して間で決定する上Odersky著らによるProgramming in Scalaから
いくつかのアドバイス。結局のところ、再利用可能な行動ではありません。
複数の関連しないクラスで再利用される可能性がある場合は、それを特性にしてください。 クラス階層の異なる部分に特性を混在させることができます。
Javaコードで継承したい場合は、抽象クラスを使用します。 コードを持つ形質には近いJava類似型がないため、Javaクラスの形質から継承するのは難しいです( )。一方 から継承Scalaクラスは、Javaクラスを継承するようなものです。 抽象メンバのみを持つScalaの特性は、 をJavaインターフェイスに直接変換するため、Javaコードが継承されると予想される場合でも、このような の特性を自由に定義する必要があります。 JavaとScalaの併用についての詳細は、第29章 を参照してください。
コンパイル済みの形式で配布する予定で、グループ外に グループが継承しているクラスを作成すると予想される場合は、抽象クラスを使用して に向かって傾けます。問題は、特性が のメンバーを取得または失うときに、 が変更されていなくても、それを継承するクラスを再コンパイルする必要があることです。外部のクライアントが の振る舞いを呼び出すのではなく、その振る舞いを継承するのではなく、その特性を使うのがいいです。
効率が非常に重要な場合は、クラスを使用してください。ほとんどのJava ランタイムは、インターフェイスメソッドの呼び出しよりも速く、クラスメンバーの仮想メソッド呼び出しを 操作にします。特性は インターフェイスにコンパイルされるため、わずかなパフォーマンスオーバーヘッドが発生する可能性があります。 ただし、この種の形質は がパフォーマンスのボトルネックになっていることがわかっていて、その代わりに実際に問題を解決するという証拠がある場合は、この選択を行う必要があります。
まだわからない場合は、上記を考慮してから、 で始まります。 はいつでも後で変更することができ、一般的には特性を使用してさらに多くのオプションを開くことができます。
- 1. クラスをインスタンス化する通常のコンストラクタではなく、 `public static function createInstance()`をいつ使うべきですか?
- 2. C#では、いつ構造体を使うべきですか?クラスはいつ使うべきですか?
- 3. 通常のクラスはResponse.RedirectをUriに使用できますか?
- 4. setUpClassはいつ使うべきですか?__init__を使うべきですか?
- 5. 通常のクラスでmediaplayerを使用
- 6. 他のコレクションの1つではなく、ScalaのArrayをいつ使うべきですか?
- 7. WCFサービスは通常シングルトンであるべきかどうか?
- 8. いつlet {}を使うべきですか?単なる普通!= nullの場合
- 9. C#リストはいつ使うべきですか?そして、いつarraylistを使うべきですか?
- 10. Jira Agileでは "Story"をいつ使うべきか "Improvement"を使うべきか
- 11. すべてのクラス40エラーは、シリアル化可能なトランザクションで通常ですか?
- 12. マルチスレッドと比べてselectをいつ使うべきですか?
- 13. ScalaにはどのようなCassandra Driverを使うべきですか?
- 14. リアクションナビゲーションではいつreduxを使うべきですか?
- 15. redux-sagaでyield * vs yieldをいつ使うべきですか?
- 16. Python 3.xでは\ nをいつ使うべきですか?
- 17. いつマルチスレッドをJavaで使うべきですか?
- 18. ウェブジョブではなくロジックアプリケーションをいつ使うべきですか?
- 19. Pythonではいつsplit()を使うべきですか?
- 20. いつredhatBaseをapache2.confで使うべきですか?
- 21. いつこれをメソッドで使うべきですか?
- 22. いつC#で(...){...}を使うべきですか?
- 23. いつaxを使うべきですか? matplotlibで?
- 24. CodeIgniterではいつコアを使うべきですか?
- 25. いつphpでセッション変数を使うべきですか?
- 26. Javaではfinalize()メソッドをいつ使うべきですか?
- 27. いつPHPで名前空間を使うべきですか?
- 28. 通常のPythonガベージコレクションプロセスに干渉するべきでしょうか?
- 29. @classmethodはいつ使うべきですか?defメソッド(self)を使うべきですか?
- 30. Reactで通常のCSSを使用できますか?
Martin Oderskyは実際には、Scalaにはメソッド、型メンバー、型の投影、パス、オブジェクト、および特性が必要だと言っています。基本的にプラットフォームの相互運用性のためだけに他のすべてがあります。しかし、他のすべてのものはそこにあるので、帽子は他のものよりも使用するのが賢明であることがあります。 IOWは、クラスと特性*が重なっていても、両方のユースケースが異なっています。 –