2013-06-03 12 views
21

特徴、ミックスイン、インターフェイスの相違点は何ですか?&私はこれらの概念を深く理解しようとしていますが、類似点と相違点を真に理解するためにこれらの機能を実装する十分なプログラミング言語はわかりません。問題が解決されているどのような特徴、ミックスインやインタフェース特性vs.ミックスインvs.

  • のそれぞれについて

  • 概念の定義はプログラミング言語全体で一貫していますか?
  • 他との類似点は何ですか?
  • どう違うのですか?
+1

Scalaには特色しかありません(ミックスインとインターフェイスは特質に含まれます)。あなたのプロフィールを見ると、Javaの背景があるようです。 Scalaを試してみると、現在のクラスと直交する実装をいくつか混在させたいときに便利なことがわかります。あなたが形質を積み重ねたい時には、そうするのは難しいです。詳細については、http://www.artima.com/pins1ed/traits.htmlを参照してください。 – huynhjl

+0

@ams:これを見てください[answer](http://stackoverflow.com/a/23124968/33311)。たとえそれが "グルーヴィー"とタグ付けされていても役に立つかもしれません。 – Lernkurve

答えて

10

以外のすべてのreference typeは、Objectを除き、1つのスーパークラスから派生しています。

ちなみに、Javaクラスはゼロ以上のインタフェースを実装しています。

一般的に言えば、インターフェイスは実装クラスを強制的に持つメソッドを記述したものですが、実装を直接提供することはありません。

つまり、Javaクラスは契約を遵守し、実装することを宣言したインタフェースによって提供されるメソッドのシグネチャに実装する必要があります。

インターフェイスはタイプを構成します。したがって、パラメータを渡して、インタフェース型として宣言されたメソッドからの戻り値を持つことができます。そのため、パラメータと戻り値の型が必ずしも具体的な実装を提供せずに特定のメソッドを実装する必要があります。

これは、たとえばdependency injectionのようないくつかの抽象パターンの基礎を設定します。

Scalaには、独自の特徴があります。 TraitはJavaインタフェースのすべての機能を提供しますが、メソッドの実装や変数を含めることができるという大きな違いがあります。 形質は、メソッドを1回だけ実装するスマートな方法であり、その方法によって、そのメソッドをその特性を拡張するすべてのクラスに配布します。 Javaクラスのインタフェースと同様に、複数の特性をScalaクラスに混在させることができます。

私はRubyのバックグラウンドを持っていないので、しかし、私はデビッド・ポラックの「はじまりのScala」(amazon link)からの抜粋にあなたを指します:

Rubyが可能な方法のコレクションであるミックスインを、持っていますどのクラスにも混在しています。 Rubyには静的型付けがなく、メソッドパラメータの型を宣言する方法がないため、mixinsを使用してインタフェースのようなコントラクトを定義する合理的な方法はありません。 Rubyのミックスインは、コードをクラスに組み立てるメカニズムを提供しますが、パラメータタイプを定義または強制する仕組みは提供していません。

インターフェイスはこの記事で説明されている以上に機能します。トピックが膨大なものになる可能性があるので、私は3つの方向のそれぞれについてより多く調査することをお勧めします。Javaの背景を持つ場合でも、Scalaとその特性は学ぶのに手頃です。

+0

すべての* refererence *型はObjectから派生していることを明確にする必要があります。プリミティブはそうではありません。私は「インターネットの周りに広く言われているように...」という文章を削除するか、有名な記事へのリンクをいくつか提供します。 – coltfred

+1

@coltfred:編集済み。 –

+0

私はPollakに、最初は「mixinsを使ってインタフェースのような契約を定義する合理的な方法はありません」という意見に同意しています - [主に* about * methods *](https://www.eiffel.com/values/design -by-contract/introduction /)、そうです。第2に、 "パラメータ型を定義または強制する仕組みではありません" - Rubyはこれに対してダックタイピングとメソッドネーミングを使用します。 [この回答をもっと見る](http://stackoverflow.com/a/177127/335847) – iain