ポリモーフィズム-2つの文だけで定義[終了]
-
03-07-2019 - |
質問
他の定義と説明を見てきましたが、満足できるものはありません。誰もコードや例を使わずに、せいぜい2文で多型を定義できるかどうかを見たいです。私は「だからあなたは人/車/缶切りを持っている...」または単語がどのように派生したかを聞きたくありません(ポリとモーフの意味を知っていることに誰も感銘を受けません)。ポリモーフィズムとは何かを非常によく理解しており、英語を十分に理解している場合は、この質問に簡潔に、しかし密集した定義で答えることができるはずです。定義でポリモーフィズムを正確に定義しているが、密度が非常に高いため、何度か読み直す必要がある場合は、まさにそれが私が探しているものです。
なぜ2つの文しかありませんか?定義は短くてインテリジェントだからです。説明は長く、例とコードが含まれています。説明についてはこちらをご覧ください(これらのページの回答は私の質問には満足できません):
ポリモーフィズムvsオーバーライドvsオーバーロード
ポリモーフィズムをできるだけ簡単に説明してください
なぜこの質問をしているのですか?同じ質問をされたので、満足のいく定義を見つけることができなかったことがわかりました(私の基準ではかなり高い)。このサイトの偉大な頭脳がそれをできるかどうかを見たいです。
2文の要件を実際に作成できない場合(定義するのが難しい主題です)、先に進んでも問題ありません。アイデアは、ポリモーフィズムとは何かを実際に定義し、それが何をするのか、またはどのように使用するのかを説明しない定義を持つことです(違いを得る?)。
解決
ポリモーフィズムにより、ある種のコントラクトの表現が可能になります。潜在的に多くの型が、それぞれの目的に応じて、さまざまな方法でそのクラスを実装します。契約がすべきではない(*)コードは、どの実装が関係しているかを気にする必要はなく、契約に従うだけです。
(*)とにかく、理想的な場合、とにかく-明らかに非常に頻繁に呼び出し元のコードが適切な実装を非常に慎重に選択しています!
他のヒント
果物は原則として食べることができますが、果物の種類はさまざまな方法で食べられます。果物であるリンゴは食べることができます(果物であるため)。バナナも食べることができますが(果物でもあるため)、リンゴとは異なります。最初に剥がします。
まあ、少なくとも私はそうですが、いくつかの方法で私は奇妙ですので、私は何を知っています。
これは、継承(果物を食べることができる)、多型(果物を食べるものはすべての種類の果物を食べることができる)、およびカプセル化(バナナには皮がある)を示しています。
しかし、オブジェクトの継承、ポリモーフィズム、カプセル化、仮想的なもの、抽象的なもの、プライベートなもの、パブリックなもの、これらはすべて難しい概念です。誰かがこれの2文の定義を絶対にしたい場合は、その質問をコードゴルフのバリアントとしてタグ付けしてください詳細を知るために必要なものを知ることができます。
多態性は、型を認識しない統一されたインターフェイスを宣言しており、実装の詳細はインターフェイスを実装する具体的な型に任せています。
実際には、多型には複数の形式があり、かなりの論争があります。正しく定義できないCS教授もいるかもしれません。私は3つのタイプを知っています:
-
アドホックポリモーフィズム(アヒルのように見え、アヒルのように歩く=>はアヒルです)。 HaskellやPythonなどで見ることができます。
-
ジェネリックポリモーフィズム(型はジェネリック型のインスタンスです)。たとえば、C ++で見ることができます(intのベクトルとstringのベクトルは両方ともメンバー関数サイズを持っています)。
-
サブタイプポリモーフィズム(タイプが別のタイプを継承する場合)。ほとんどのオブジェクト指向プログラミング言語で見ることができます(つまり、三角形はシェイプです)。
Wikipedia:ポリモーフィズムは、さまざまなデータ型の値を統一されたインターフェイスを使用して処理できるプログラミング言語機能です。私にとってはとても簡単です。
なぜこの質問をしているのか、本当に理解しています。私は多型を理解していますが、就職の面接で、多型の簡潔で明確な定義をするように頼まれました。私は明確で短い定義を与えることができなかったので、私はそれについて考え始めました、そしてここに私の定義があります:
1つのタイプのオブジェクトが1つの同じインターフェースを持つが、このインターフェースの実装が異なる能力。
定義:
ポリモーフィズムは、$ 1のアイデアを表す$ 10の言葉です。何かするように頼むとき、最終結果が適切である限り、どのように達成されるかは気にしません。 サービスが正しく提供されている限り、実装について気にしません。
ディスカッション
ソフトウェア開発、特にオブジェクト指向の原則に従って開発されたシステムで一般的に使用されていますが、ポリモーフィズムは基本的に実世界の原則であり、技術的な用語ではなく、実世界の用語で定義する必要があります。
例
電話をかけたいときは、電話を取り、番号をダイヤルして、相手の相手と話します。誰が電話を作ったのか、どの技術を使用しているのか、有線、無線、モバイル、VOIPのいずれであるのか、それとも保証期間中なのかは気にしません。
ドキュメントを印刷するときは、印刷します。実装言語、プリンターのブランド、接続スタイル、消耗品の選択、紙の品質については気にしません。
同じインターフェースの複数の実装。
例:電話の多くのモデルは、数字キーパッドインターフェイスを実装しています。
ポリモーフィズムは、オブジェクトモデルを設計するときに使用されるオブジェクト指向の戦略であり、コードの簡素化に役立ちます。コアポリモーフィズムは、2つの類似したまだ異なるオブジェクトを定義し、2つのオブジェクトを同じものとして扱う機能です。
それは難しい...。
ポリモーフィズムとは何かという独自の解釈を追加したいと考えました。非常に一般的に、ポリモーフィズムは、異なるタイプのエンティティに単一のインターフェースを提供する行為です。
それはかなり一般的ですが、それが私が知っている3つのタイプのポリモーフィズムすべてをラップする唯一の方法です:アドホック、パラメトリック、サブタイプ。以下で詳細に説明し、ポリモーフィズムのタイプを名前でアルファベット順にソートします。興味のあるものは、おそらく最後のサブタイプであるサブタイプ多型でしょう。
アドホックポリモーフィズム
アドホックポリモーフィズムは、異なるパラメータタイプに対して同じメソッドの複数の実装を提供する行為です。 OOP では、一般的に method overloading として知られています。例:
public String format(int a) {
return String.format("%2d", a);
}
public String format(Date a) {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}
format
の両方のメソッドは単一のインターフェースを共有しますが、異なるタイプのエンティティで機能します。
パラメトリック多型
パラメトリックポリモーフィズムは、それ自体がクラス(またはメソッド)のパラメーターである型に対してクラス(またはメソッド)を機能させる行為です。多くの場合、ジェネリックと呼ばれます。
たとえば、Javaの List [T]
はインスタンス化時にパラメーター T
を必要とし、このパラメーターは結果のオブジェクトのタイプを定義します。
純粋主義者のために注意してください。私は意図的に生の種類を無視しているのです。
List [String]
と List [Date]
は単一のインターフェイスを共有しますが、異なるタイプで動作します。
サブタイプ多型
サブタイプポリモーフィズムは、おそらくあなたの質問で最初に意図したものです。同じタイプの複数の実装に単一のインターフェイスを提供する行為です。
慣習的な例を使用するには: Animal
は、すべての実装が尊重しなければならないコントラクトを提供します。 Dog
は Animal
であり、 Animal
が宣言するすべての操作をサポートします。 Liskovの置換原則によれば、これにより Dog のインスタンスを使用できます
Animal
のインスタンスが予想される場所(ただし、その逆ではない)。
Cat
と Dog
が両方とも Animal
のサブクラスである場合、これらは単一インターフェースを共有しますが、事実さまざまなタイプ。
ここでは少し接線方向に進んでいますが、サブタイプのポリモーフィズムはオーバーライドを許可する唯一の(私が思うに):aによって定義されるメソッドの動作を再定義する行為です親クラス。これは、前に見たように、ポリモーフィズムの一種であり、実際にはサブクラス化を必要としない(実際にはクラスを必要としない)オーバーロードと混同されることがよくあります。
ポリモーフィズムは、いくつかの異なる基礎エンティティ(通常はデータですが、常に常に)がすべて共通のインターフェイスを共有するソフトウェアコーディングの抽象化であり、実行時に同一の外観と動作を可能にします。これを開発手法として使用して、絶対的な最小限の実装で、類似ではあるが同一ではないさまざまなインスタンスで一貫した動作を実施し、バグや不整合に対する期待を減らします。
ポール。
多態性==複数のクラス+同じメソッドシグネチャ+クラス固有の動作。
最高の定義がここに提供されているようですので、 2セントどうか、他のオブザーバーのために。もっと役立つことを願っています。
ポリモーフィズムには2種類あります:
1. Compile-time (static) polymorphism or (ad hoc) polymorphism.
それは単にメソッドのオーバーロードと演算子のオーバーロードです
2. Run time or (dynamic) polymorphism.
最初の用語 は、JavaおよびC ++の用語から継承されています。
ただし、 .NET の用語では、 2番目の用語( ランタイムポリモーフィズム の意味)のみが実際にポリモーフィズムと見なされ、単に ポリモーフィズム と呼ばれます。
そして私が知る限り、実装には3つの方法があります(ランタイム)ポリモーフィズム。
1. Parametric polymorphism or simply the use of generics (templates in C++).
2. Inheritance-based polymorphism or subtyping.
3. Interface-based polymorphism.
インターフェイスベースのポリモーフィズムの簡単な例:
interface Imobile
{
void Move();
}
class Person :Imobile
{
public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}
class Bird :Imobile
{
public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}
class Car :Imobile
{
public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}
class Program
{
static void Main(string[] args)
{
// Preparing a list of objects
List<Imobile> mobileList = new List<Imobile>();
mobileList.Add(new Person());
mobileList.Add(new Bird());
mobileList.Add(new Car());
foreach (Imobile mobile in mobileList)
{
mobile.Move();
}
// Keep the console open
Console.WriteLine("Press any key to exit the program:");
Console.ReadKey();
}
}
出力:
I am a person and am moving in my way.
I am a bird and am moving in my way.
I am a car and am moving in my way.
Press any key to exit the program:
単一のオブジェクトの複数のフォームはポリモーフィズムと呼ばれます。
ポリモーフィズムとは、同じ呼び出しに対してオブジェクトが異なって表示および動作する能力です。 例:それぞれの動物は異なって表示され、鳴ります(叩くと:))
多態性は、オブジェクトをそのスーパータイプのインスタンスとして扱うことができるプログラミング言語の機能です。
単一の名前を、異なるタイプの一連の類似した操作に与えます。うまくいけば、例えは明らかです。 「追加」算術的な数字と「加算」連結による文字列(長さの合計)。
多態性
異なるオブジェクトは同じメッセージに異なる方法で応答し、オブジェクトが正確なタイプを知らなくても相互にやり取りできるようにします。
経由: http://www.agiledata.org/essays/objectOrientation101.html
これは私がずっと従ってきた定義です:
2つのオブジェクトは、両方が同じメッセージに同じセマンティックで応答する場合、それらの間で(特定のプロトコルに関して)ポリモーフィックです。
ポリモーフィズムはメッセージに関するものであり、同じセマンティックで同じメッセージセットに応答できることです。
2つのオブジェクトが空に応答できる場合ただし、メッセージのセマンティックは異なります。..それらは多態性ではありません。
下位レベルのポリモーフィズムは、インターフェイスインスタンスからインターフェイスの実装者によって定義されたメソッドを呼び出す機能です。
ポリモーフィズムは、オブジェクトに多くのタイプ(「シェイプ」)を持たせるプログラミング機能であり、他のタイプを知らないか気にすることなく、必要に応じてオブジェクトをそれらのタイプのいずれかとして扱うことができます。
ポリモーフィズムは、高レベルのアルゴリズムコードを複数の種類のデータで変更せずに動作させる言語機能です。
(C ++がサポートするタイプは、私の答えにリストされ、対比されています: c ++のポリモーフィズム)
最近、ポリモーフィズムの概念が現象になりました。これが実際のドリフトです。ランタイムは、スーパークラスの参照によって呼び出されるサブメソッドを定義します。さて、実際にはどういう意味ですか?実際には何も意味しません。ポリモーフィズムなしで簡単にコーディングできます。なぜ?なぜなら、ポリモーフィズムがなければ、すべてのサブクラス関数の定義を記憶しなければならなかったからです。ポリモーフィズムは、実際にはこれから私たちを救います。
次のようにリストを定義できます:
List list = new List();
ただし、 IList
をチェックすると、次のようなインターフェースの利点が得られます。
IList list = new List();
および IList
参照を自由に使用します。 IList
が別のクラスにも実装されていると仮定すると、そのクラス名を覚えようとせずに IList
参照を介してその未知のクラスのメソッドを使用できます。素晴らしいですね。
今、より価値のある情報が来ています:
Javaはデフォルトでポリモーフィックですが、.NETとC ++はMSでは、ベース関数 virtual
(および.NET override
キーワード)を宣言する必要があります。
また、ポリモーフィズムには2つの不可欠なルールがあります。 1つは継承(インターフェース実装またはクラス拡張による)で、もう1つはオーバーライドです。オーバーライドすることなく、ポリモーフィズムは存在しません。メソッドのオーバーロード(常に単一のクラスにある)も&quot; minimalistic&quot;のタイプであることに注意してください。ポリモーフィズム。
特定のメソッドシグネチャに対して、異なる、階層的に関連するクラスに対して異なるメソッド実装が実行されます。
多態性とは、特定の実装を必要とせずに、共通のインターフェースを実装する(または共通の基本クラスを拡張する)さまざまなクラスを使用し、共通のインターフェースで使用可能なメソッドのみを使用する機能です。
Ie:Javaでは、ArrayListとLinkedListの両方がListを実装しているため、変数をListとして宣言すると、変数がArrayListまたはLinkedListのどちらとしてインスタンス化されたかに関係なく、Listで許可された操作をいつでも実行できます。
同じタイプのエンティティ(つまり、同じインターフェイスを実装するか、同じクラスから派生する)は、異なる方法で(同じメソッド名で)動作します。
(extendsまたはimplementsを使用して何らかの継承関係を持つ)異なるクラスで同じシグネチャのメソッドを実装することは、メソッドのオーバーライドであり、ポリモーフィズムでもあると思います。 / p>
オブジェクトは動的に呼び出されることもあると思います。オブジェクトが古典的なシェイプポリの三角形、正方形などかどうかはわかりません。例。
したがって、そのようなことをすべて残すために、派生クラスの関数を呼び出して、動的クラスの1つが呼び出されると仮定します。
正方形、三角形、長方形のどれでも構いません。あなたはただそのエリアを気にします。したがって、渡された動的オブジェクトに応じてgetAreaメソッドが呼び出されます。
多態性とは、異なるデータ型の入力データを受け入れるように自動的に適応する関数の機能です。 2つのダブル文字「1.1」と「2.2」を「追加」し、「3.3」または「追加」の2つの文字列&quot; Stack&quot;を取得できます。および「オーバーフロー」 &quot; StackOverflow&quot;を取得します。
多相性とは、異なるオブジェクトが同じメソッドに異なる方法で応答する場合です。たとえば、人が道路を歩いている間、車は道路を動きます。これらは、同じ道路に異なる方法で応答する2つのオブジェクトです。