ポリモーフィズム-たった2つの文で定義する[クローズ]


85

私は他の定義と説明を見てきましたが、どれも私を満足させません。コードや例を使用せずに、最大2つの文でポリモーフィズムを定義できる人がいるかどうかを確認したいと思います。「だから、人/車/缶切りがあります...」またはその単語がどのように派生したかを聞きたくありません(ポリとモーフの意味を知っていることに誰も感心しません)。ポリモーフィズムとは何かを非常によく理解していて、英語を上手に使いこなせる場合は、この質問に、密度は高いものの、短い定義で答えることができるはずです。あなたの定義がポリモーフィズムを正確に定義しているが、それが数回の読み直しを必要とするほど密集している場合、それはまさに私が探しているものです。

なぜ2文しかないのですか?定義が短くてインテリジェントだからです。説明は長く、例とコードが含まれています。説明についてはこちらをご覧ください(これらのページの回答は私の質問には不十分です):

ポリモーフィズムvsオーバーライドvsオーバーロードポリモーフィズムをできるだけ
簡単に説明するようにしてください

なぜ私はこの質問をしているのですか?同じ質問をされたのですが、満足のいく定義を思い付くことができなかったのです(私の基準ではかなり高いです)。私はこのサイトの偉大な頭脳のいずれかがそれを行うことができるかどうかを見たいと思います。

2文の要件を実際に作成できない場合(定義するのが難しい主題です)、それを超えても問題ありません。アイデアは、実際にポリモーフィズムとは何かを定義し、それが何をするのか、またはそれをどのように使用するのかを説明しない定義を持つことです(違いを理解しますか?)。


1つの名前、複数の実装。
Prosunjit Biswas 2016

2
私は就職の面接でこの質問をされました。就職の面接でそれを尋ねることは、エリート主義のスノッブ行為であると感じました。これは、Googleの従業員が、誰も効果的に答えられないと仮定して、こっそりと尋ねるようなものです。答えられなかったために仕事に就けなかった場合は、誰よりも自分に何ができるかに興味を持っている人のために働くほうがよいでしょう。
MagicLAMP 2017

ポリモーフィズムは、開発において理解するための非常に重要な概念です。正式な定義ではないにしても、少なくともその価値を理解することを強くお勧めします。ストラテジーパターンがどのように機能するか、そしてその価値については、ほとんど説明できないことをお勧めします。
チャドジョンソン

回答:


106

ポリモーフィズムは、ある種のコントラクトの表現を可能にし、潜在的に多くのタイプが、それぞれ独自の目的に応じて、さまざまな方法でそのコントラクトを実装します(クラスの継承によるかどうかは関係ありません)。そのコントラクトを使用するコードは、どの実装が関係しているかを気にする必要はなく(*)、コントラクトが守られることだけを気にする必要があります。

(*)とにかく、理想的なケースでは、明らかに、呼び出し元のコードが適切な実装を非常に慎重に選択していることがよくあります。


1
マーク、あなたはある時点でこの答えを受け入れ、それからそれを受け入れませんでしたか?私はレピュテーションシステムのバグのように見えるものを見つけようとしています-この答えは、奇妙なことに、今日の私に-15の担当者のネットを与えました。
Jon Skeet

ここでも同じです、ジョン-私は今、-15人の担当者で2つの受け入れられた回答を持っています。私が気にしているわけではありませんが、それは興味をそそられます。
オタビオデシオ2009年

3
厳密に言えば、「1つのタイプが何らかの契約を表す」という要件はありません。本当に必要なのは、メッセージの送信者がどの実装がメッセージを処理しているかを知る必要がなく、複数の実装が同じメッセージに応答できることだけです。
Doug Knesek 2009年

3
@Doug:契約がない場合、文書化や命名によって暗示されていても、いったいどうやってそれがあなたが望むことをするだろうと知っていますか?あなたはあなた自身の答えの中で「インターフェース」について話します-それは私にとって契約のように聞こえます-あなたは違いとして何を見ますか?「interface」と「contract」はどちらも、「強い」意味で(たとえば、コンパイル時に強制される)または非常に緩く(たとえば、命名規則や動的型付けを使用することによって)使用できる単語です。
Jon Skeet

1
@アレックス:はい、それは私が元に戻す編集になります-私は私の言葉遣いを好みます。ただし、いつでも独自の回答を追加できます。
Jon Skeet 2014

72

果物は原則として食べることができますが、さまざまな種類の果物はさまざまな方法で食べられます。果物であるリンゴは(果物なので)食べることができます。バナナも食べることができますが(果物でもあるため)、リンゴとは方法が異なります。あなたは最初にそれをはがします。

まあ、少なくとも私はそうですが、私はいくつかの点で奇妙なので、私は何を知っていますか。

これは、継承(果物を食べることができる)、多型(果物を食べるものはすべての種類の果物を食べることができる)、およびカプセル化(バナナには皮がある)を示しています。

真面目な話ですが、オブジェクトの継承、ポリモーフィズム、カプセル化、仮想的なもの、抽象的なもの、プライベートなもの、パブリックなもの、これらはすべて難しい概念です。誰かが絶対にこれの2文の定義を持ちたい場合は、質問にコードゴルフバリアントとしてタグを付けてください。そのような2つの文は非常に簡潔である必要があるため、すでに何であるかを知らない限り、十分に学ぶことはできません。それはあなたがもっと学ぶ必要があることを知るためです。


lassevk:「それがすでに何であるかを知らない限り、あなたはそれについてもっと学ぶ必要があることを知るのに十分なことを学ぶことはできません」<<明確にするために、それは私が期待していることです。理解するのに少し考えが必要な定義を探しています。初心者を教えるために使用されるものではありません。
マークテスタ

2
私はそれを集めました、私はちょうど少しユーモラスな(とにかく私に)答えを投稿しました:)ポリモーフィズムとOOPはそれらの大きな壁の1つです、あなたが学習曲線をグラフ化すると、あなたはただ大きな壁にぶつかり、どちらかがそれを這う、またはあなたはしません。もしそうなら、あなたは通常大きなAHAを持っています!経験...
ラッセV. Karlsenの

8
ヘムロックも果物です!一度だけ食べられます!
ジェームズアンダーソン

@JamesAndersonでは、シングルトンですか?
Lasse V. Karlsen 2017

47

ポリモーフィズムは、型を認識しない統一されたインターフェースを宣言し、実装の詳細をインターフェースを実装する具体的な型に任せています。


これは驚くほど簡潔で、完璧にフィットすると思います
Alex W

21

ウィキペディア:ポリモーフィズムは、さまざまなデータ型の値を統一されたインターフェイスを使用して処理できるようにするプログラミング言語機能です。私にとってはかなり簡単です。


21

実際、ポリモーフィズムには複数の形態があり、それについてはかなりの論争があります。あなたはそれを適切に定義することができないCS教授を見さえするかもしれません。私は3つのタイプを知っています:

  • アドホック多相性(アヒルのように見え、アヒルのように歩く=>はアヒルです)。たとえば、HaskellやPythonで見ることができます。

  • ジェネリックポリモーフィズム(タイプがジェネリックタイプのインスタンスである場合)。たとえば、C ++で見ることができます(intのベクトルとstringのベクトルは両方ともメンバー関数サイズを持っています)。

  • サブタイプポリモーフィズム(あるタイプが別のタイプから継承する場合)。ほとんどのオブジェクト指向プログラミング言語で見ることができます(つまり、三角形は形状です)。


2
さまざまなタイプのポリモーフィズムがあることに言及するための+1。ただし、アドホック多相性の定義は、en.wikipedia.org / wiki / Type_polymorphismで言及されているものとはかなり異なるようです。そのページには、3つではなく2つのタイプ(アドホックとパラメトリック)があり、ポリモーフィック関数とポリモーフィックデータ型を区別していると書かれています。私が判断できる限り、あなたの3つのタイプは、それぞれパラメトリックポリモーフィック関数、パラメトリックポリモーフィックデータ型、およびアドホック多相関数に対応します。
ローレンスゴンサルベス

こんにちは、「あるジェネリック型のインスタンス」と「別の型から継承する」の違いは何ですか?これらは同じことを言っているようです。
Shanimal 2018

@LaurenceGonsalves fwiw、最初のコメントで提供されたリンクは3つのタイプを指しています。パラメトリックポリモーフィズムは、関数またはデータ型を「一般的に」書き込むことを可能にするものとして定義されます。
Shanimal 2018

14

なぜあなたがこの質問をしているのか、私は本当に理解しています。私はポリモーフィズムを理解していますが、就職の面接で、ポリモーフィズムの簡潔で明確な定義をするように求められました。明確で短い定義を与えることができなかったので、私はそれについて考え始めました、そしてここに私の定義があります:

1つのタイプのオブジェクトが、1つの同じインターフェースを持つが、このインターフェースの実装が異なる機能。


10

定義

ポリモーフィズムは、1ドルのアイデアを表す10ドルの言葉です。何かをするように頼んだとき、最終結果が適切である限り、それがどのように達成されるかは気にしません。サービスが正しく提供されている限り、実装は気しません

討論

ソフトウェア開発、特にオブジェクト指向の原則に従って開発されたシステムで一般的に使用されていますが、ポリモーフィズムは基本的に現実世界の原則であり、技術的な用語ではなく、現実世界の用語で定義する必要があります。

電話をかけたいときは、電話を取り、番号をダイヤルして、相手と話します。誰が電話を作ったか、どのテクノロジーを使用しているか、有線、無線、モバイル、VOIPのいずれであるか、保証期間内かどうかは関係ありません。

ドキュメントを印刷したいときは、印刷します。実装言語、プリンターのブランド、接続のスタイル、消耗品の選択、または用紙の品質は気にしません。


5
Encapsulation私にとっては例のように聞こえます
シングルトン2010

1
ポリモーフィズム、カプセル化、抽象化はすべて非常に密接に関連していますが、それらは異なる視点に焦点を合わせています。優れた抽象化はポリモーフィズムの実現を容易にし、優れたカプセル化は詳細の「リーク」を防ぐのに役立ちます。
Bevan 2010

10

同じインターフェースの複数の実装。

例:電話の多くのモデルは、テンキーインターフェイスを実装しています。


8

ポリモーフィズムは、コードを単純化するために、オブジェクトモデルを設計するときに使用されるオブジェクト指向の戦略です。その核となるポリモーフィズムは、2つの類似しているが異なるオブジェクトを定義し、2つのオブジェクトを同じものとして扱う機能です。

難しいですね。


7

ポリモーフィズムとは何かについての独自の解釈を追加しようと思っただけです。非常に一般的に、ポリモーフィズムは、さまざまなタイプのエンティティに単一のインターフェイスを提供する行為です。

これはかなり一般的ですが、私が知っている3種類のポリモーフィズム(アドホックパラメトリックサブタイプ)すべてをラップするために考えることができる唯一の方法です。以下で詳細を説明し、ポリモーフィズムのタイプを名前のアルファベット順にソートしました。あなたが興味を持っているのは、おそらく最後のものであるサブタイプのポリモーフィズムです。

アドホック多相性

アドホック多相性は、異なるパラメータータイプに対して同じメソッドの複数の実装を提供する行為です。ではOOP、それが一般的として知られているメソッドのオーバーロード。例えば:

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宣言するすべての操作をサポートします。リスコフの置換原則によれば、これによりDog、のインスタンスAnimalが期待される場所のインスタンスを使用できます(ただし、その逆はできません)。

場合CatDogの両方のサブクラスであるAnimal、そして、彼らが共有する単一のインターフェイスを実際にされているさまざまなタイプ

ここでは少し正接しますが、オーバーライドを許可するのはサブタイプのポリモーフィズムだけです。つまり、親クラスによって定義されたメソッドの動作を再定義する行為です。これは、前に見たように、一種のポリモーフィズムであり、実際にはサブクラス化を必要としないオーバーロードと混同されることがよくあります(実際にはクラスも必要ありません)。


では、インターフェースベースのポリモーフィズムはどうですか?
siamak 2014年

@siamakは、親型が完全に抽象的である特定の種類のサブタイプポリモーフィズムだけではありませんか?それとも何か他の意味ですか?
ニコラスリナウド

私のインターフェイスの意図は、次のようなオブジェクト指向言語に存在する参照タイプとしてのインターフェイスです。インターフェイスI1 {void M();}サブタイプまたは継承ベースのポリモーフィズムとインターフェイスベースのポリモーフィズムの間には非常に多くの違いがあると思います。 。タイプ間の継承ベースのポリモーフィズムには「Is-a」関係がありますが、インターフェイスベースのポリモーフィズムにはそのような関係がないためです。実際、異なる実装での同じ動作は、さまざまな異なるタイプ(クラス)間で共有される可能性があります
siamak 2014年

私は混乱していることを認めなければなりません-大文字へのやや弾道的なアプローチを除けば、インターフェイスベースのポリモーフィズムと呼ばれるものの説明は、サブタイプのポリモーフィズムの説明とまったく同じようです。違いはあると思いますが、はっきりしないのではないかと思います。
ニコラスリナウド2014年

ご覧のとおり、車と鳥と人の間に関係はありませんが、彼らは独自の方法で動くことができます。抽象クラスとインターフェースの間には大きな違いがあり、インターフェースの使用はサブタイピングと同じではないため、私の意見では、継承ポリモーフィズムとインターフェースベースのポリモーフィズムは同じものではなく、等しくありません。//難しい、コメントセグメントでのコーディング//
siamak 2014年

6

ここでは最良の定義が提供されているようです。他のオブザーバーのために、2セントを追加させてください。それがもっと役立つことを願っています。

多型には2種類あります。

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

それは単にメソッドのオーバーロードと演算子のオーバーロードです

2.  Run time or (dynamic) polymorphism.

最初の用語は、JavaおよびC ++の用語から継承されています。

しかし、中に.NETの用語のみ秒1I平均実行時間の多型は)本当に多型として想定していると単に呼ばれる多型

そして私が知る限り、実装には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:

私はあなたが作る違いをまだ見ていません。人、鳥、車はすべてImobileのサブタイプです。人はImobile、BirdはImobile、車はImobileです。Imobileタイプの変数が必要な場合は、Person、Bird、Carのいずれかのインスタンスを使用でき、すべてタイプチェックになります。それがまさにサブタイプポリモーフィズムの意味です。
ニコラスリナウド2014年

Bird and Person and CarはImobileのサブタイプではなく、そのインターフェイスの実装者であり、独自の方法でそのインターフェイスを「実現」します。「サブタイプ」という用語は、実際のタイプとそれを継承した実際のサブタイプの間で広く使用されています。この状況では、それらの間に「Is-a」関係があります。たとえば、犬は哺乳類のサブタイプです。
siamak 2014年

コンパイラの観点からは、インターフェイスへの参照を作成し、その参照を使用することは、真実で正しいことです。/ BUT / ITは、継承関係のサブタイプと同等の概念ではありません。そして、インターフェイスの実装者をサブタイプとして呼び出すのは非常に厄介で、実際には真実ではないと思います。
siamak 2014年

継承ベースのポリモーフィズムの例は、この答えを説明するのに適しています。
マルセロメイソン

5

ポリモーフィズムは、いくつかの異なる基盤となるエンティティ(通常はデータですが、常にnit)がすべて共通のインターフェイスを共有するソフトウェアコーディングの抽象化であり、実行時に同じように見え、同じように動作します。これを開発手法として使用して、実装が最小限で、類似しているが同一ではないさまざまなインスタンスで一貫した動作を強制し、バグや不整合の予想を減らします。

ポール。


5

ポリモーフィズム==複数のクラス+同じメソッドシグネチャ+クラス固有の動作。


2

単一のオブジェクトの複数の形式は、ポリモーフィズムと呼ばれます。


2

ポリモーフィズム

異なるオブジェクトは異なる方法で同じメッセージに応答でき、オブジェクトが正確なタイプを知らなくても相互に対話できるようにします。

経由:http//www.agiledata.org/essays/objectOrientation101.html


2

ポリモーフィズムとは、同じ呼び出しに対してオブジェクトが表示され、異なる動作をする能力です。例:各動物の外観と音は異なります(叩いたとき:))


2

ポリモーフィズムは、オブジェクトをそのスーパータイプのインスタンスとして扱うことを可能にするプログラミング言語の機能です。


反対票-理由を説明していただけますか?
TarkaDaal 2013年

1

異なるタイプの類似操作のセットに単一の名前を付ける。うまくいけば、類推は明白です。たとえば、数値を算術的に「加算」したり、連結(長さを合計したり)によって文字列を「加算」したりします。


1

これは私がいつも従ってきた定義です:

2つのオブジェクトが同じセマンティクスで同じメッセージに応答する場合、2つのオブジェクトは(特定のプロトコルに関して)多態的です。

ポリモーフィズムとは、メッセージに関するものであり、同じセマンティクスで同じメッセージのセットに応答できることに関するものです。

2つのオブジェクトが空に応答できる場合は?しかし、メッセージのセマンティクスは異なります。したがって、それらはポリモーフィックではありません。


1

下位レベルの多態性は、インターフェイスインスタンスからインターフェイスの実装者によって定義されたメソッドを呼び出す機能です。


1

ポリモーフィズムは、オブジェクトに多くのタイプ(「形状」)を持たせることができるプログラミング機能であり、他のタイプを知らなくても、何をする必要があるかに応じて、オブジェクトをそれらのタイプのいずれかとして扱うことができます。


1

ポリモーフィズムは、高レベルのアルゴリズムコードが複数のタイプのデータに対して変更なしで動作できるようにする言語機能です。 そして他の文、それが何のためだったとしても... ;-P。

(C ++がサポートするタイプは、私の答え:c ++のポリモーフィズムにリストされ、対比されています)


0

ポリモーフィズムの概念は最近現象になりました。これが実際のドリフトです。ランタイムは、スーパークラスの参照によって呼び出されるサブメソッドを定義します。さて、実際にはどういう意味ですか?それは実際には何の意味もありません。ポリモーフィズムなしで簡単にコーディングできます。なぜ?なぜなら、ポリモーフィズムがない場合は、すべてのサブクラス関数の定義を記憶する必要があったからです。ポリモーフィズムは、実際にはこれから私たちを救います。

リストは次のように定義できます。

List list = new List();

ただし、を確認するとIList、次のようなインターフェイスのメリットが得られます。

IList list = new List();

IList参照を自由に使用してください。IList別のクラスにも実装されていると仮定すると、IListそのクラス名を覚えようとせずに、再度参照することでその未知のクラスのメソッドを使用できます。素晴らしいですね。

今、より価値のある情報が来ています:
されています。Javaはデフォルトで多態性ですが、.NETとC ++はそうではありません。MSでは、基本関数virtual(および.NEToverrideキーワード)を宣言する必要があります。

また、ポリモーフィズムには2つの統合ルールがあります。1つは継承(インターフェイスの実装またはクラスの拡張を介して)であり、もう1つはオーバーライドです。オーバーライドしないと、ポリモーフィズムは存在しません。メソッドのオーバーロード(常に単一のクラス)も一種の「最小限の」ポリモーフィズムであることに注意してください。


1
それは2文以上です。
危険な

0

特定のメソッドシグネチャに対して、階層的に関連するさまざまなクラスに対してさまざまなメソッド実装が実行されます。


0

ポリモーフィズムとは、特定の実装を必要とせずに、共通のインターフェースで使用可能なメソッドのみを使用して、共通のインターフェースを実装する(または共通の基本クラスを拡張する)さまざまなクラスを使用する機能です。

つまり、Javaでは、ArrayListとLinkedListの両方がListを実装しているため、変数をListとして宣言すると、変数がArrayListまたはLinkedListのどちらとしてインスタンス化されたかに関係なく、Listで許可されている操作をいつでも実行できます。


0

同じタイプのエンティティ(つまり、同じインターフェイスを実装するか、同じクラスから派生する)は、異なる方法で(同じメソッド名で)動作します。


0

異なるクラスでの同じシグニチャのメソッドの実装(extendsまたはimplementsのいずれかを使用して何らかの継承関係を持つ)は、メソッドのオーバーライドであり、ポリモーフィズムでもあると思います。このようにして、同じメソッドシグニチャの多くの形式を実現しているからです。


-2

オブジェクトが動的に呼び出されることもあると思います。オブジェクトが古典的な形状のポリゴンの三角形、正方形などであるかどうかはわかりません。例。

したがって、そのようなものをすべて残すために、派生クラスの関数を呼び出し、動的クラスの1つが呼び出されると想定します。

正方形、三角形、長方形のどれでもかまいません。あなたはただその地域を気にします。したがって、渡された動的オブジェクトに応じてgetAreaメソッドが呼び出されます。


-2

ポリモーフィズムは、さまざまなデータ型の入力データを受け入れるように自動的に適応する関数の機能です。「Add」2つのdouble「1.1」と「2.2」を取得して「3.3」を取得するか、「Add」2つの文字列「Stack」と「Overflow」を取得して「StackOverflow」を取得できます。


なぜ誰かがこれをマークダウンしたのですか?これは、ポリモーフィズムに関するNationalInstrumentのWebページからの「文字通りの答え」です!!!
J-Dizzle 2015

-3

ポリモーフィズムとは、異なるオブジェクトが同じメソッドに異なる方法で応答する場合です。たとえば、人が道路を歩いているときに車が道路を移動します。これらは、同じ道路に異なる方法で応答する2つのオブジェクトです。


実際、ポリモーフィズムは、さまざまなクラスのインスタンスを共通の型と見なしており、さまざまなクラスがそれらのメソッドを実装する方法とは関係なく、この共通の型で宣言されたメソッドを使用できました。
GaRRaPeTa 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.