كيفية إعادة استخدام الكود عندما لا يكون الوراثة المتعددة خيارًا؟

StackOverflow https://stackoverflow.com/questions/1202986

سؤال

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

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

المحلول

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

نصائح أخرى

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

ويمكنك إعادة بعد ذلك طرق الإرشاد عندما كانوا يعملون على نفس النوع.

public static void MyMethod( this MyType target ){}


MyType.MyMethod()

ما هو مبين أدناه، إذا كان لديك فئة التي تستمد من MyType أو الأدوات الأكثر شيوعا واجهة طريقة تمديد يعمل على، وتمديد عمل لهؤلاء.

public class MyDerived : MyType{}

MyDerived.MyMethod()

من الناحية الفنية، تنفذ C# عدة واجهه المستخدم الميراث ولكن ليس التعددتطبيق الميراث.

تكمن مشكلة توريث التنفيذ المتعدد في أنه يؤدي إلى حالات مثل مشكلة الماس.

يمكنك محاكاة توريث التنفيذ المتعدد باستخدام واجهة متعددة الوراثة والتأليف ، وهو قريب مما وصفته بأنه إنشاء الكائنات التي تريد إعادة استخدامها "ككائنات عضو".ما لا تريده ومع ذلك ، فإن القيام بذلك هو فضح السلوك غير الضروري من النوع الملفوف الخاص بك.

فيما يلي مخطط للفئة يوضح المبدأ الأساسي للمضاعفات الوراثة من خلال التكوين:

الوراثة المتعددة http://www.freeimagehosting.net/uploads/cb219cefba.jpg

عيب هذا هو أن أي تغييرات على واجهة IBreeper سوف تتطلب التغييرات المقابلة ل Breeper ، والعكس صحيح.

أخذ خطوة إلى الوراء على الرغم من ذلك - تحتاج إلى النظر بعناية في أسباب تأليف الطبقات القديمة.هل إلى:

  1. تعزيز أو تعزيز السلوك الحالي.يجب عليك بعد ذلك النظر في نمط الوكيل;

  2. أنشئ "مركزًا واحدًا" لجميع سلوكياتك.يجب عليك حقًا أن تفعل هذا فقط إذا كان لديك سوبر فادلر يكون متماسك (أي أن جميع السلوكيات المكشوفة تتم محاذاة)، وإلا فسوف تنتقل إلى كائن الله الوضع الذي لا يفضي إلى أن تكون قابلة للصيانة؛

  3. تقديم واجهة أكثر اتساقًا مع طريقة الاستخدام التي تتطلبها فئة معينة من عملاء SuperFuddler الخاص بك.في هذه الحالة، عليك أن تأخذ بعين الاعتبار نمط المحول.

ويمكنك أنها وهمية بسهولة جدا مثل هذا:

public interface IFoo {
    void DoFoo();
}

public class Foo : IFoo {
    public void DoFoo() { Console.Write("Foo"); }
}

public class Bar {
    public void DoBar() { Console.Write("Bar"); }
}

public class FooBar : IFoo, Bar {
    private IFoo baseFoo = new Foo();
    public void DoFoo() { baseFoo.DoFoo(); }
}

//...

FooBar fooBar = new FooBar();

fooBar.DoFoo();
fooBar.DoBar();

وإذا كنت قد وضعت لهم كمكون، واستخدامها لا ترث منهم

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