سؤال

بعد النظر إلى كيف اذهب يتعامل مع واجهات وأعجبه، بدأت أفكر في كيفية تحقيق كتابة طبقة بطة مماثلة في C # مثل هذا:

var mallard = new Mallard(); // doesn't implement IDuck but has the right methods
IDuck duck = DuckTyper.Adapt<Mallard,IDuck>(mallard);

ال DuckTyper.Adapt سوف تستخدم الطريقة System.Reflection.Emit لبناء محول على الطاير. ربما شخص ما قد كتب بالفعل شيئا مثل هذا. أعتقد أنه ليس مختلفا جدا عن ما تفعله الأطر السخرية بالفعل.

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

هل هناك طريقة أفضل؟

تعديل: على ما يبدو المصطلح المناسب لما أسميه "طباعة بطة آمنة" هي الطباعة الهيكلية.

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

المحلول

كيف يمكنك معرفة ما إذا كانت البقرة تمشي مثل بطة وأجهز مثل بطة إذا لم يكن لديك لقعة معيشة أو تنفس أمامك؟

طب الكتابة هو مفهوم يستخدم في وقت التشغيل. مفهوم مماثل في وقت الترجمة هو الطباعة الهيكلية وهو AFAIK غير مدعوم من CLR. (تركز CLR حولها الكتابة الترشيحية.)

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

الطريقة المعتادة لضمان أن يلقي طباعة البط بدون استثناء في وقت التشغيل اختبارات الوحدة.

نصائح أخرى

ducktyping ل C #

revection.emit يستخدم لإبعاد IL الذي يستدعي مباشرة الكائن الأصلي

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

لا أعتقد أن هناك طريقة أخرى تحصل فيها على خطأ في توقيت الترجمة.

ومع ذلك، هذا شيء اختبار الوحدة رائع ل. سوف تكتب اختبار وحدة للتحقق من ذلك

DuckTyper.Adapt<Mallard, IDuck>(mallard);

الخرائط بنجاح.

أعلم أن الواجهات الضمنية (التي هي ما هي واجهات الذهاب) مخطط لها ل VB 10 (لا فكرة عن C #). لسوء الحظ، تم إخراجها قبل الإصدار (أعتقد أنهم لم يصنعوا ذلك في بيتا ...). سيكون من الجيد معرفة ما إذا كان سيتم إثبات مظهر في نسخة مستقبيلة من .NET.

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

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