سؤال

منح:

interface I
{
}

class B: I
{
}

class C: I
{
}

class A
{

    public void Method(B arg)
    {
    }

    public void Method(C arg)
    {
    }

    public void Method(I arg)
    {
       // THIS is the method I want to simplify.
       if (I is B)
       {
          this.Method(arg as B);
       }
       else if (I is C)
       {
          this.Method(arg as C);
       }
    }
}

أعلم أن هناك طرقًا أفضل لتصميم هذا النوع من التفاعلات ، ولكن بسبب التفاصيل التي قد تستغرق وقتًا طويلاً لشرح ذلك غير ممكن.نظرًا لأن هذا النمط سيتم تكراره عدة مرات ، أود استبدال المنطق المشروط بتنفيذ عام يمكنني استخدامه فقط.لا أستطيع أن أرى طريقة بسيطة لتنفيذ هذه الطريقة/الفئة العامة، لكن حدسي يخبرني أنه يجب أن يكون ممكنًا.

سيكون موضع تقدير أي مساعدة.

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

المحلول

وما تريده هو ضعف ارسال ، و <لأ href = "HTTP: // en.wikipedia.org/wiki/Visitor_pattern "يختلط =" نوفولو noreferrer "> نمط الزوار على وجه الخصوص.

نصائح أخرى

وأود أن وضع طريقة داخل واجهة ومن ثم السماح تعدد الأشكال التي تقرر طريقة للاتصال

interface I
{
   void Method();
}

class B : I
{
   public void Method() { /* previously A.Method(B) */}
}

class C : I
{
   public void Method() { /* previously A.Method(C) */ }
}

class A
{
   public void Method(I obj)
   { 
     obj.Method();
   }
}

والآن عندما تحتاج إلى إضافة فئة جديدة، تحتاج فقط إلى تنفيذ I.Method. لا تحتاج للمس A.Method.

وهذا هو قبيح كيندا لكنه يحصل على هذه المهمة:

public void Method(B arg)
{
  if (arg == null) return;
...
}
public void Method(C arg)
{
  if (arg == null) return;
...
}

public void Method(I arg)
{
  this.Method(arg as B);
  this.Method(arg as C);
}

وأنا لا أعتقد أنني سوف تفعل ذلك بهذه الطريقة، وإن كان. فعلا يضر النظر في ذلك. أنا آسف لأني اضطر لكم جميعا أن ننظر إلى هذا أيضا.

interface I
{ 
} 

class B : I
{
}

class C : I
{
}    

class A 
{
    public void Method(B arg)
    {
        Console.WriteLine("I'm in B");
    }

    public void Method(C arg)
    {
        Console.WriteLine("I'm in C");
    }

    public void Method(I arg)
    {
        Type type = arg.GetType();

        MethodInfo method = typeof(A).GetMethod("Method", new Type[] { type });
        method.Invoke(this, new I[] { arg });
    }
}

إنه غير موجود في شكل مناسب مع C# - انظر هنا للحصول على فكرة مبنية على مطابقة نمط F#، فهذا يفعل ما تريده بالضبط.يمكنك القيام ببعض الأشياء مع الانعكاس لتحديد التحميل الزائد في وقت التشغيل، ولكن ذلك سيكون بطيئًا للغاية، وسيواجه مشكلات خطيرة إذا كان أي شيء يرضي كلا التحميلين الزائدين.إذا كان لديك قيمة إرجاع، فيمكنك استخدام العامل الشرطي؛

return (I is B) ? Method((B)I) : ((I is C) ? Method((C)I) : 0);

مرة أخرى - ليست جميلة.

وسهلة. في Visual Basic أفعل كل هذا الوقت باستخدام CallByName.

Sub MethodBase(value as Object)
    CallByName(Me, "RealMethod", CallType.Method, value)

وهذا سوف ندعو الزائد من RealMethod الأكثر تطابقا يطابق نوع وقت التشغيل من القيمة.

وأنا متأكد من أنك يمكن استخدام CallByName من C # عن طريق استيراد Microsoft.VisualBasic.Interaction أو عن طريق إنشاء النسخة الخاصة بك باستخدام الانعكاس.

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