違いは、何かとは何か、どのように動作するかです。
多くの言語はこの2つを融合させようとしますが、それらはまったく異なるものです。
方法とは何か、方法とは...
すべてが継承する場合object
、いくつかの利点が発生します。たとえば、オブジェクトの任意の変数が任意の値を保持できます。しかし、摩擦でもあること、すべてがしなければならない(振る舞うかのように)object
(のような、と見てどのような)object
。
だが:
- オブジェクトに平等の意味のある定義がない場合はどうなりますか?
- 意味のあるハッシュがない場合はどうなりますか?
- オブジェクトを複製できないが、オブジェクトは複製できる場合はどうなりますか?
いずれのobject
タイプも、オブジェクトがすべての可能なインスタンスに共通性を提供しないため、本質的に役に立たなくなります。あるいは、いくつかの推定普遍的な性質の壊れた/靴・ホーンド/不条理定義が上で発見したオブジェクトが存在しますobject
どのprovies ほとんど落とし穴の数を除き、普遍的な行動を。
方法に縛られないものは
あるいは、WhatとHowを別々に保つことができます。次に、いくつかの異なるタイプ(何もまったく何も共通していない)は、コラボレーターからどのように見えるかと同じようにすべて動作できます。この意味で、anのアイデアはIterator
特定のwhatではなく、howです。具体的にどのようにあなたがまだ知らないときのものと対話するかどうあなたと対話しています。
Java(および同様のもの)は、インターフェースを使用することでこれへのアプローチを可能にします。この点に関するインターフェースは、通信の手段を記述し、暗黙的に通信のプロトコルとそれに続くアクションを記述します。どれでもどんな与えられたのであることを自分自身を宣言した方法は、それがプロトコルによって概説関連する通信やアクションをサポートしていることを述べています。これにより、どのコラボレーターがどのWhatを使用できるかを正確に指定することで、どのコラボレーターもHowに依存し、困惑することがなくなります。
C ++(および同様の)では、ダックタイピングによってこれにアプローチできます。テンプレートは、特定のコンパイルコンテキスト内で、特定の方法でオブジェクトと対話できるという動作に従うことを、協調型が宣言しているかどうかを気にしません。これにより、C ++ポインター、および特定の演算子をオーバーライドするオブジェクトを同じコードで使用できます。同等と見なされるチェックリストを満たすため。
- * a、a->、++ a、およびa ++->入力/転送反復子をサポート
- * a、a->、++ a、a ++、-a、およびa--->双方向イテレーターをサポート
基礎となる型は、コンテナを反復する必要もありません。何でもかまいません。さらに、一部のコラボレーターをさらに汎用的にするa++
ことができます。関数が必要とするものを想像してください。イテレーターはそれを満たすことができ、ポインターも整数もできるので、オブジェクトを実装できますoperator++
。
仕様の過不足
両方のアプローチの問題は仕様の過不足です。
インターフェイスを使用するには、オブジェクトが特定の動作をサポートすることを宣言する必要があります。これは、作成者が最初からそれを埋め込む必要があることも意味します。彼らはそれを宣言しなかったので、これはカットを作らないものを引き起こします。これは、WhatがHowを表すインターフェースである共通の祖先を持つことも意味します。これはの最初の問題に戻りobject
ます。これにより、共同編集者は要件を過剰に指定すると同時に、一部のオブジェクトが宣言の欠如のために使用できなくなったり、期待される動作が十分に定義されていないために隠されたりします。
テンプレートを使用するには、コラボレーターが完全に未知のWhatと連携し、その相互作用を通じてHowを定義する必要があります。ある程度のコラボレーターの作成は難しくなります。コンパイルエラーを回避しながら通信プリミティブ(関数/フィールドなど)のWhatを分析する必要があるか、少なくとも、特定のWhatがHowの要件に一致しない方法を指摘する必要があるためです。これにより、コラボレーターは指定されたWhatからの絶対的な最小値を要求できるようになり、使用されるものの最も広い範囲が許可されます。残念ながら、これには、特定の通信プリミティブを技術的に提供するオブジェクトの無意味な使用を許可するという欠点があります。どのように、ただし、あらゆる種類の悪いことが発生することを許可する暗黙のプロトコルに従わないでください。
イテレータ
この場合Iterator
でどのようにそれは、相互作用の記述の省略形です。その説明に一致するものはすべて、定義上、Iterator
です。方法を知ることにより、一般的なアルゴリズムを記述し、アルゴリズムを機能させるために提供する必要のある「どのように特定の何を与えるか」の短いリストを得ることができます。そのリストはfunction / properties / etcであり、それらの実装では、アルゴリズムによって処理されている特定のWhatが考慮されます。