質問

...またはその心に何か起きているのかこんなことをしたのだろう。とは思ってそれぞれWikipedia: 多型, 複数の派遣, が、うまく見てどのよう概念が異なります。

編集: どのような 過負荷 せます。

役に立ちましたか?

解決

多型の施設できる言語-プログラムの判断は実行中に関する方法を呼び出すと、パラメータに送信する方法です。

数のパラメータを使用する言語ランタイムの決定の型の多型を支える言語です。

単一の派遣で多型がパラメータを用い、受け取り手のメッセージ- this, や self を決定してから通報してください。

複数の派遣で多型が複数のパラメータを使用するかを決定する方法金がかかる場合があります。この場合、受光器径の種類の方法に使用するパラメータを伝える方法を呼び出す.

できるという多型を総称して、複数のシングルを派遣している特定の種類の多型.

補足:過負荷が起こる時のコンパイルす。このタイプを使用していて情報が行決定の方法金がかかる場合があります。シングル/複数の派遣などを引き起こを行います。

サンプルコード:

using NUnit.Framework;

namespace SanityCheck.UnitTests.StackOverflow
{
    [TestFixture]
    public class DispatchTypes
    {
        [Test]
        public void Polymorphism()
        {
            Baz baz = new Baz();
            Foo foo = new Foo();

            // overloading - parameter type is known during compile time
            Assert.AreEqual("zap object", baz.Zap("hello"));
            Assert.AreEqual("zap foo", baz.Zap(foo));


            // virtual call - single dispatch. Baz is used.
            Zapper zapper = baz;
            Assert.AreEqual("zap object", zapper.Zap("hello"));
            Assert.AreEqual("zap foo", zapper.Zap(foo));


            // C# has doesn't support multiple dispatch so it doesn't
            // know that oFoo is actually of type Foo.
            //
            // In languages with multiple dispatch, the type of oFoo will 
            // also be used in runtime so Baz.Zap(Foo) will be called
            // instead of Baz.Zap(object)
            object oFoo = foo;
            Assert.AreEqual("zap object", zapper.Zap(oFoo));
        }

        public class Zapper
        {
            public virtual string Zap(object o) { return "generic zapper" ; }
            public virtual string Zap(Foo f) { return "generic zapper"; }
        }

        public class Baz : Zapper
        {
            public override string Zap(object o) { return "zap object"; }
            public override string Zap(Foo f) { return "zap foo"; }
        }

        public class Foo { }
    }
}

他のヒント

複数の派遣方法で複数の引数に渡されるので、実装に依存して各引数の型です。のための評価により開されたものの翻訳であります。にLISPでチェックの各タイプから。言語を複数の派遣を利用汎用の機能では、関数の宣言という汎用方法、利用型のパラメータ。

複数の派遣を可能にす subtyping多型 引数のための方法。

単一の派遣も可能で、限られた種類の多型を使用して同じ名前のメソッドオブジェクトを実装する同インタフェースを継承し、同じベースを行っています。-この例の多い方法ソッドをオーバーライドがサブクラス

その向こうに ジェネリック医薬品 をパラメトリックタイプの多型(つまり、同じハードウェアの使用に異なる種類のものだけでなく、関係のないように List<T>:できるリストの任意の型と同じ方法で使用されるに関わらず).

私の方はまったく知らない複数の派遣前、ナのWikipediaページでどのようなMDタイプの多型を使っての引数メソッドになっています。

多型に基のコンセプトのもとにオブジェクトとして見ることができずタイプです。そして、それが CarTruck, でも見られるとして Vehicle.つまり、次のように呼び出せますの他 Vehicle 方法のいずれかです。

複数の派遣により、これにより、呼び出す方法で引数を複数の種類だと思いますか一定の要件を説明するため最初にするものではありませんが必要と共通の基底タイプとなれるようにと想像を実施するに当たりな void* きるとして複数のオブジェクト。

その代わりに呼び出し Start() 法べてのオブジェクト一覧(クラシック多型例です StartObject(Object C) 方法の定義、他の地域では行うことができなコードを確認することとしており、引数種類実行時に適切に取扱います。の差は、 Start() 法の構築が必要にクラスは、 StartObject() 法で定義以外のクラスで、各種オブジェクトなのに準拠して、インターフェース。

このコミュニケーションを取り合の Start() 方法が必要という異なる論争することができます。か Car.Start(Key carKey)Missile.Start(int launchCode)

もとも呼べるで StartObject(theCar) または StartObject(theMissile)

興味深いコンセプト...

複数送りのように機能過負荷などJava/C++を除き、機能を呼び出しの実行時の型の引数は、その静的タイプです。

ご希望の場合は概念上相当のメソッドの呼び出し

(obj_1, obj_2, ..., obj_n)->method

に依存するそれぞれの特定の型のタプルするために使うことができる複数の派遣すること。多型に対応する場合にはn=1のときには必須の機能のOOP.

複数の派遣という多型.Java/C#/C++のある多型を継承とをオーバーがない複数の派遣に基づく二つ以上の引数または this, のように、Java/C#/C++)

複数の派遣に依存しない多型です。典型的な多型がC++、C#、VB.NETなど---。単に派遣すなわちこの機能を取得するというだけに依存単一のクラスのインスタンス.複数の派遣に依存して複数のクラスのインスタンス.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top