88

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

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

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

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

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

4

31 に答える 31

107

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

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

于 2009-01-03T22:13:04.027 に答える
74

果物は原則として食べることができますが、果物の種類によって食べ方が異なります。果物であるりんごは食べられます(果物なので)。バナナも(果物なので)食べられますが、リンゴとは食べ方が違います。まず皮をむきます。

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

これは、継承 (果物を食べることができる)、ポリモーフィズム (果物を食べるものはすべての種類の果物を食べることができる)、カプセル化 (バナナには皮がある) を示しています。

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

于 2009-01-03T22:10:29.070 に答える
48

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

于 2009-01-03T22:12:37.880 に答える
21

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

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

  • ジェネリック ポリモーフィズム (型がジェネリック型のインスタンスである場合)。たとえば、C++ で見ることができます (int のベクトルと文字列のベクトルの両方にメンバー関数のサイズがあります)。

  • サブタイプ ポリモーフィズム (型が別の型から継承される場合)。ほとんどの OO プログラミング言語で見られます (つまり、Triangle は Shape です)。

于 2009-01-03T22:53:30.810 に答える
21

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

于 2009-01-03T22:12:47.787 に答える
16

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

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

于 2009-07-05T21:41:03.310 に答える
12

定義:

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

討論

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

電話をかけたいときは、受話器を取って番号をダイヤルし、相手と話します。誰が電話を作ったのか、どんな技術を使っているのか、有線か無線かモバイルか VOIP か、保証期間中かどうかは気にしません。

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

于 2009-04-07T06:54:36.457 に答える
10

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

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

于 2009-11-14T17:17:57.663 に答える
8

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

わかりましたそれは難しいです....

于 2009-01-03T22:11:08.447 に答える
6

ここで最良の定義が提供されているようですので、他のオブザーバーのために、私の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:
于 2014-10-21T00:03:14.227 に答える
5

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

ポール。

于 2009-01-03T23:50:39.960 に答える
2

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

于 2012-03-07T20:02:43.307 に答える
2

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

于 2013-01-07T09:16:44.777 に答える
2

ポリモーフィズム

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

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

于 2009-01-04T22:12:48.317 に答える
2

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

于 2009-01-03T22:44:35.570 に答える
1

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

于 2010-01-08T14:33:24.510 に答える
1

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

于 2010-01-08T15:45:35.737 に答える
1

これは、私が常に従ってきた定義です。

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

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

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

于 2010-01-08T14:19:50.110 に答える
1

異なる型に対する一連の類似操作に単一の名前を付ける。適切に行われると、類似性は明らかです。たとえば、数値を算術的に「加算」し、文字列を連結 (長さの合計) によって「加算」します。

于 2009-01-03T22:39:05.440 に答える
1

ポリモーフィズムは、高レベルのアルゴリズム コードを変更せずに複数の種類のデータに対して操作できるようにする言語機能です。 もう 1 つの文は、その目的が何であれ... ;-P.

( C++ がサポートする型は、私の回答: Polymorphism in c++にリストされ、対比されています)

于 2011-06-16T06:14:25.330 に答える
0

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

于 2013-03-11T10:55:12.410 に答える
0

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

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

List list = new List();

しかし、 をチェックするとIList、次のようにインターフェイスを利用できます。

IList list = new List();

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


Java はデフォルトでポリモーフィックですが、.NET と C++ はポリモーフィックではありません。MS では、基本関数を (および .NET キーワードで) 宣言する必要がありvirtualますoverride

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

于 2013-03-03T03:22:05.937 に答える
0

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

于 2014-04-18T16:50:13.290 に答える
0

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

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

于 2014-09-16T19:53:21.650 に答える
0

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

于 2013-02-14T21:07:14.413 に答える
-2

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

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

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

于 2010-01-17T05:48:10.617 に答える
-2

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

于 2015-08-21T16:51:55.763 に答える
-5

異なるメソッドを実行する単一のクラスは、ポリモーフィズムと呼ばれます。

于 2009-04-07T06:20:03.903 に答える