سوف C#4 تسمح الديناميكية "الصب"?إذا لا ينبغي أن C# دعم ذلك ؟

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

سؤال

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

على سبيل المثال ،

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = (dynamic<IMyInterface>)myTextBox;

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

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

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

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

المحلول

أعتقد جون السكيت وقد كان مثل هذا الاقتراح (http://msmvps.com/blogs/jon_skeet/archive/2008/10/30/c-4-0-dynamic-lt-t-gt.aspx) ولكن حتى الآن لم أسمع أن C# 4.0 سوف يكون عليه.

نصائح أخرى

أعتقد أن هذه الإشكالية.أنت إدخال اقتران بين فئتين التي لا تقترن.

النظر في التعليمات البرمجية التالية.

public interface IFoo
{
   int MethodA();
   int MethodB();
}

public class Bar
{
   int MethodA();
   int MethodB();
}

public class SomeClass
{
   int MethodFoo(IFoo someFoo);
}

أن هذا ثم تكون قانونية ؟

int blah = someClass.MethodFoo((dynamic<IFoo>)bar);

ذلك يبدو كما يجب أن تكون قانونية ، لأن المترجم ينبغي أن تكون قادرة على حيوي نوع شريط شيء تنفذ IFoo.

ومع ذلك ، في هذه المرحلة كنت اقتران IFoo وبار خلال مكالمة في مجموعة منفصلة تماما جزء من التعليمات البرمجية الخاصة بك.

إذا قمت بتحرير بار لأنه لم يعد يحتاج MethodB فجأة someClass.MethodFood لا يعمل بعد الآن ، على الرغم من شريط IFoo ليست ذات صلة.

في نفس الطريق, إذا قمت بإضافة MethodC() إلى IFoo التعليمات البرمجية كسر مرة أخرى ، على الرغم من IFoo وبار ظاهريا غير ذات الصلة.

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

ليست هناك حاجة ل C# دعم هذا, كما يمكن تنفيذها نظيفة جدا مثل المكتبة.

رأيت ثلاثة أو أربعة تطبيقات منفصلة (بدأت في كتابة واحد نفسي قبل أن أجد لهم).هنا هو الأكثر شمولا العلاج رأيت:

http://bartdesmet.net/blogs/bart/archive/2008/11/10/introducing-the-c-ducktaper-bridging-the-dynamic-world-with-the-static-world.aspx

فإنه من المحتمل أن يكون أسهل لتنفيذ مرة DLR يتم دمجها في وقت التشغيل.

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

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

أنها لا تزال تفعل الأشياء الجيدة في C# 4.0 (الفرق الميزات) ولكن هناك الكثير من الأشياء التي يمكن أن يكون القيام به لجعل نوع نظام ذكاء أكثر تلقائية وأكثر قوة في الكشف عن المشاكل في وقت الترجمة.بدلا من ذلك, نحن أساسا الحصول على وسيلة للتحايل.

في إطار مفتوحة المصدر مرتجلة-واجهة هل هذا باستخدام C# 4 و dlr.

using ImpromptuInterface;

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = myTextBox.ActLike<IMyInterface>();

لأنه يستخدم dlr فإنه سيتم أيضا العمل مع ExpandoObject و DynamicObject.

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