سؤال

سمعت/قراءة المصطلح ولكن لا أفهم تماما ما يعنيه.

متى يجب استخدام هذه التقنية وكيف يمكنني استخدامه ؟ أي شخص يمكن أن توفر التعليمات البرمجية العينة ؟

هل كانت مفيدة؟

المحلول

الزائر نمط هو وسيلة للقيام المزدوجة الإرسال في وسيلة وجوه المنحى.

انها مفيدة عندما تريد أن تختار الطريقة التي يجب استخدامها لفترة معينة الحجة على أساس النوع في وقت التشغيل بدلا من تجميع الوقت.

ضعف الإرسال هو حالة خاصة من متعددة الإرسال.

عند استدعاء أسلوب الظاهري على كائن ، التي تعتبر واحدة الإرسال لأن الذي الفعلية تسمى الأسلوب يعتمد على نوع من كائن واحد.

المزدوجة الإرسال ، كل كائن نوع الأسلوب الوحيد الحجة نوع يؤخذ في الاعتبار.هذا هو مثل طريقة الزائد القرار, إلا أن الحجة نوع يتم تحديدها في وقت التشغيل المزدوج الإرسال بدلا من ثابت في وقت التحويل البرمجي.

في متعددة الإرسال, طريقة يمكن أن يكون العديد من الحجج التي مرت بها والتي تنفيذ يستخدم يعتمد على كل حجة نوع.من أجل أن أنواع تقييم يعتمد على اللغة.في اللثغة ، فإنه يتحقق كل نوع من الأول إلى الأخير.

لغات متعددة الإرسال الاستفادة من المهام العامة التي هي مجرد وظيفة delcarations و ليست مثل عام الطرق التي تستخدم نوع المعلمات.

أن تفعل انقر نقرا مزدوجا الإرسال في C#, يمكنك تعريف الأسلوب مع الكائن الوحيد الحجة ثم أساليب محددة مع أنواع محددة:

using System.Linq;  

class DoubleDispatch
{ 
    public T Foo<T>(object arg)
    { 
        var method = from m in GetType().GetMethods()
                   where    m.Name == "Foo" 
                         && m.GetParameters().Length==1
                         && arg.GetType().IsAssignableFrom
                                           (m.GetParameters()[0].GetType())
                         && m.ReturnType == typeof(T)
                   select m;

        return (T) method.Single().Invoke(this,new object[]{arg});          
    }

    public int Foo(int arg) { /* ... */ }

    static void Test() 
    { 
        object x = 5;
        Foo<int>(x); //should call Foo(int) via Foo<T>(object).
    }
}       

نصائح أخرى

حسنا يا رفاق, مدونة نشرت من قبل مارك ليست كاملة و ما من أي وقت مضى هناك ليس العامل.

حتى أنب وكاملة.

class DoubleDispatch
{
    public T Foo<T>(object arg)
    {
        var method = from m in GetType().GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)
                     where m.Name == "Foo"
                           && m.GetParameters().Length == 1
                           //&& arg.GetType().IsAssignableFrom
                           //                  (m.GetParameters()[0].GetType())
                           &&Type.GetType(m.GetParameters()[0].ParameterType.FullName).IsAssignableFrom(arg.GetType())
                           && m.ReturnType == typeof(T)
                     select m;


        return (T)method.Single().Invoke(this, new object[] { arg });
    }

    public int Foo(int arg)
    {
        return 10;
    }

    public string Foo(string arg)
    {
        return 5.ToString();
    }

    public static void Main(string[] args)
    {
        object x = 5;
        DoubleDispatch dispatch = new DoubleDispatch();

        Console.WriteLine(dispatch.Foo<int>(x));


        Console.WriteLine(dispatch.Foo<string>(x.ToString()));

        Console.ReadLine();
    }
}

شكرا مارك وغيرها لطيفة تفسير على ضعف المرسل نمط

C# 4 يدخل الزائفة نوع dynamic الذي يحل استدعاء دالة في وقت التشغيل (بدلا من تجميع الوقت).(هذا هو وقت التشغيل نوع من يستخدم التعبير).انقر نقرا مزدوجا (أو متعدد الإرسال) يمكن أن تكون مبسطة إلى:

class C { }

static void Foo(C x) => Console.WriteLine(nameof(Foo));
static void Foo(object x) => Console.WriteLine(nameof(Object));

public static void Main(string[] args)
{
    object x = new C();

    Foo((dynamic)x); // prints: "Foo"
    Foo(x);          // prints: "Object"
}

نلاحظ أيضا باستخدام dynamic يمكنك منع ثابت محلل مترجم لدراسة هذا الجزء من التعليمات البرمجية.لذا يجب عليك أن تنظر بعناية في استخدام dynamic.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top