문제

...또는 그들은 같은 일입니까?지는 각각 자신의 위키백과 항목: 다형성, 여러 Dispatch, 지만,문제가 있음을 보고 어떻게 이 개념이 다릅니다.

편집: 그리고 어떻게 오버로드 맞으로 모든 이?

도움이 되었습니까?

해결책

다형성은 언어/프로그램이 해당 방법으로 전송 된 매개 변수의 유형을 기반으로 호출 할 방법을 런타임 중에 결정을 내릴 수있는 시설입니다.

언어/런타임이 사용하는 매개 변수의 수는 언어가 지원하는 다형성의 '유형'을 결정합니다.

단일 디스패치는 하나의 매개 변수 만 사용되는 다형성 유형입니다 (메시지 수신기 - 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에서는 각 유형을 먼저 확인합니다. 다수의 발송이있는 언어는 제네릭 함수를 사용하는데,이 기능은 단지 함수 선언이며 유형 매개 변수를 사용하는 일반적인 방법과 같지 않습니다.

다중 발송이 허용됩니다 하위 유형 다형성 메소드 호출에 대한 인수.

단일 디스패치는 또한보다 제한된 종류의 다형성을 허용합니다 (동일한 인터페이스를 구현하거나 동일한 기본 클래스를 상속하는 객체의 동일한 메소드 이름을 사용). 그것은 당신이 서브 클래스에서 무시되는 방법을 가지고있는 다형성의 전형적인 예입니다.

그 외에는 제네릭 파라 메트릭 유형 다형성을 제공합니다 (즉, 관련이없는 경우에도 다른 유형으로 사용할 수있는 동일한 일반 인터페이스). List<T>: 모든 유형의 목록이 될 수 있으며 관계없이 동일한 방식으로 사용됩니다).

나는 이전에 여러 번의 파견에 대해 들어 본 적이 없지만 Wikipedia 페이지를 보면 MD와 비슷해 보인다.

다형성은 본질적으로 객체가 기본 유형으로 볼 수 있다는 개념입니다. 그래서 당신이 있다면 Car 그리고 a Truck, 둘 다 a로 볼 수 있습니다 Vehicle. 이것은 당신이 전화 할 수 있음을 의미합니다 Vehicle 하나에 대한 방법.

다중 발송은 비슷해 보이며 여러 유형의 인수로 메소드를 호출 할 수 있지만 설명에는 특정 요구 사항이 표시되지 않습니다. 첫째, 공통 기본 유형이 필요하지 않은 것 같습니다 ( void*) 그리고 여러 객체가 관련 될 수 있습니다.

그래서 전화하는 대신 Start() 목록의 모든 객체에 대한 메소드 (고전적인 다형성 예제) StartObject(Object C) 다른 곳에서 정의 된 메소드 및 코딩하여 실행 시간에 인수 유형을 확인하고 적절하게 처리합니다. 여기서 차이점은 Start() 방법은 클래스에 내장되어야하며 StartObject() 메소드는 클래스 외부에서 정의 될 수 있으므로 다양한 객체가 인터페이스를 준수 할 필요가 없습니다.

이것은 좋을 것입니다 Start() 다른 인수로 방법을 호출해야했습니다. 아마도 Car.Start(Key carKey) vs. 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 ++처럼)

여러 Dispatch 에 의존한 다형성 기반으로합니다.전형적인 다형성에서 발생하는 C++,C#,VB.NET 등...사용 단일 발송-즉함수 호출에 따라 하나의 클래스의 인스턴스입니다.여러 dispatch 에 의존하 여러 개의 클래스의 인스턴스가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top