web-dev-qa-db-ja.com

多態性-わずか2文で定義する

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

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

ポリモーフィズムvsオーバーライドvsオーバーロード
できるだけ簡単にポリモーフィズムを記述してみてください

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

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

83
Mark Testa

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

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

103
Jon Skeet

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

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

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

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

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

47
Eran Galperin

実際、多型には複数の形態があり、それについてはかなりの論争があります。正しく定義できないCS教授もいるかもしれません。私は3つのタイプを知っています:

  • アドホックポリモーフィズム(アヒルのように見え、アヒルのように歩く=>はアヒルです)。 HaskellおよびPythonなどで見ることができます。

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

  • サブタイプ多型(型が別の型を継承する場合)。ほとんどのOOプログラミング言語で見ることができます(つまり、三角形はシェイプです)。

21
Afd

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

20
Otávio Décio

なぜあなたがこの質問をしているのか、本当に理解しています。私は多型を理解していますが、就職の面接で、多型の短く明確な定義を与えるように頼まれました。私は明確で短い定義を与えることができなかったので、私はそれについて考え始めました、そしてここに私の定義があります:

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

14
Nikolay Traykov

定義

多態性は、$ 1のアイデアを表す$ 10の言葉です。何かするように頼んだとき、最終結果が適切である限り、どのように達成されるかは気にしません。 serviceが正しく提供されている限り、Ido n't care実装について。

ディスカッション

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

電話をかけたいときは、電話を取り、番号をダイヤルして、相手側と話します。誰が電話を作ったのか、どの技術を使用しているのか、有線、無線、モバイル、VOIPのいずれであるのか、それとも保証期間内であるのかは気にしません。

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

10
Bevan

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

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

10
Doug Knesek

ポリモーフィズムは、オブジェクトモデルの設計時に使用されるオブジェクト指向の戦略であり、コードの簡素化に役立ちます。コアポリモーフィズムは、2つの類似したまだ異なるオブジェクトを定義し、2つのオブジェクトを同じものとして扱う機能です。

それは難しい...

6
JoshBerke

ポリモーフィズムとは何かという独自の解釈を追加したいと思ったところです。非常に一般的に、ポリモーフィズムは、単一のインターフェース異なるタイプ

それはかなり一般的ですが、それは私が知っている3つのタイプのポリモーフィズムすべてをラップする唯一の方法です:ad hocparametricおよびsubtype。以下で詳しく説明し、ポリモーフィズムのタイプを名前でアルファベット順にソートします。あなたが興味を持っているのは、おそらくサブタイプ多型であり、これが最後です。

アドホック多型

アドホックポリモーフィズムは、異なるパラメータタイプに対して同じメソッドの複数の実装を提供する行為です。 [〜#〜] 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メソッドは単一のインターフェースを共有しますが、異なるタイプのエンティティで動作します

パラメトリック多型

パラメトリックポリモーフィズムは、クラス(またはメソッド)自体がクラス(またはメソッド)のパラメーターである型で動作するようにする行為です。多くの場合、genericsと呼ばれます。

たとえば、JavaのList[T]は、インスタンス化時にパラメーターTを予期します。このパラメーターは、結果のオブジェクトのタイプを定義します。

純粋主義者のために注意してください。私は意図的にrawタイプを無視しています。

List[String]およびList[Date]単一のインターフェースを共有しますが、動作します(そして)異なるタイプ

サブタイプ多型

サブタイプ多態性は、おそらくあなたの質問で最初に意味したものです:それは、同じタイプの複数の実装に単一のインターフェイスを提供する行為です。

通常の例を使用するには:Animalは、すべての実装が尊重しなければならないコントラクトを提供します。 DogAnimalであり、Animalが宣言するすべての操作をサポートします。 リスコフ置換の原理 によれば、これはDogのインスタンスが期待される場所でAnimalのインスタンスを使用することを可能にします(しかしその逆はできません)。

CatDogが両方ともAnimalのサブクラスである場合、それらは単一インターフェースを共有しますが、実際には異なるタイプです。

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

6
Nicolas Rinaudo

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

5
S.Lott

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

2種類のポリモーフィズムがあります。

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

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

2.  Run time or (dynamic) polymorphism.

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

しかし、。NETの用語では、2番目の(つまり、実行時ポリモーフィズム)はポリモーフィズムとして想定されており、単にと呼ばれますポリモーフィズム

私の知る限り、(run timepolymorphismを実装するための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:
5
siamak

ポリモーフィズムは、いくつかの異なる基礎となるエンティティ(通常はデータですが、常にニット)がすべて共通のインターフェイスを共有するソフトウェアコーディングの抽象化であり、実行時に同一の外観と動作を可能にします。これを開発テクニックとして使用して、絶対的な最小限の実装で、類似しているが同一ではないさまざまなインスタンスで一貫した動作を実施し、バグや不整合に対する期待を減らします。

ポール。

5
Paul W Homer

多態性は、オブジェクトをそのスーパータイプのインスタンスとして扱うことができるプログラミング言語の機能です。

2
TarkaDaal

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

2
Mallik

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

2
milot

ポリモーフィズムは、高レベルのアルゴリズムコードを複数の種類のデータで変更せずに動作させることができる言語機能です。 そして、他の文、それが何であれ... ;-P。

(私の答えでは、C++がサポートするタイプがリストされ、対比されています: c ++の多態性

1
Tony Delroy

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

2つのオブジェクトが同じセマンティクスで同じメッセージに応答する場合、2つのオブジェクトはそれらの間で(特定のプロトコルに関して)ポリモーフィックです。

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

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

1

ポリモーフィズム

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

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

1
Matt

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

1
Jeff Sternal

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

1
joel.neely

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

1
Igor Zevaka

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

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

List list = new List();

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

IList list = new List();

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

今、より価値のある情報が来ています:
Javaはデフォルトでポリモーフィックですが、MSでは.NETとC++はそうではありませんが、MSではベース関数virtual(および.NET overrideキーワード)を宣言する必要があります。

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

0
jazziiilove

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

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

0
GaRRaPeTa

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

0
anand

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

0
Paolo

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

0
paul paul