يمكنني إجبار الفئات الفرعية لتجاوز أسلوب دون جعله مجردة؟

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

سؤال

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

هل هناك طريقة للاحتفال الطرق بحيث لم يتم تنفيذها من قبل الفئات الفرعية، دون وضع العلامات عليها كما مجردة؟

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

المحلول

وحسنا يمكنك أن تفعل بعض الفوضى حقا كود تنطوي #if - أي في DEBUG هو الظاهري (للمصمم)، ولكن في RELEASE أنها مجردة. A الألم الحقيقي للحفاظ، على الرغم من.

ولكن البعض من ذلك: في الأساس، لا. إذا كنت تريد دعم مصمم أنه لا يمكن أن تكون مجردة، لذلك كنت مع ترك "افتراضية" (ويفترض مع أسلوب قاعدة رمي NotImplementedException).

وبطبيعة الحال، فإن وحدة الاختبارات الخاصة بك تأكد من أن الطرق تم تنفيذها، نعم؟ ؛-p

في الواقع، ربما يكون من السهل جدا لاختبار عن طريق الوراثة - أي يكون لديك طريقة اختبار عام للنموذج:

[Test]
public void TestFoo() {
  ActualTest<Foo>();
}
[Test]
public void TestBar() {
  ActualTest<Bar>();
}

static void ActualTest<T>() where T : SomeBaseClass, new() {
  T obj = new T();
  Assert.blah something involving obj
}

نصائح أخرى

هل يمكن استخدام الإشارة إلى لغة التنفيذ في صفك.

public class DesignerHappy
{
    private ADesignerHappyImp imp_;

    public int MyMethod()
    {
        return imp_.MyMethod()    
    }

    public int MyProperty
    {
        get { return imp_.MyProperty; }
        set { imp_.MyProperty = value; }
    }
}

public abstract class ADesignerHappyImp
{
    public abstract int MyMethod();
    public int MyProperty {get; set;}
}

وDesignerHappy فقط يعرض واجهة تريد ولكن توجيه كافة المكالمات إلى كائن التنفيذ. على تمديد السلوك كتبها sub-classing ADesignerHappyImp، الذي يجبرك على تنفيذ جميع أعضاء مجردة.

ويمكنك توفير تطبيق الافتراضي ADesignerHappyImp، والذي يستخدم لتهيئة DesignerHappy افتراضيا ويعرض خاصية تسمح لك بتغيير التنفيذ.

لاحظ أن "DesignMode" لم يتم تعيين في منشئ. تم ضبطه بعد VS يوزع InitializeComponents () طريقة.

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

والطبقة المكونات تحتوي على خاصية منطقية تسمى "DesignMode" وهو مفيد جدا عندما تريد التعليمات البرمجية لتتصرف بشكل مختلف في المصمم من في وقت التشغيل. قد يكون من بعض استخدامها في هذه الحالة.

وكقاعدة عامة، إذا كان هناك أي وسيلة في اللغة أن تفعل شيئا وهذا يعني عادة أن هناك سبب وجيه لعدم المفاهيمي للقيام بذلك.

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

في هذه الحالة تريد طريقة الظاهري تجاوز الامم المتحدة لرمي استثناء وقت الترجمة (نوعا ما، وتشغيل مرة واحدة). في الأساس وسيلة مجردة ثم.

وجعل الطرق الافتراضية تتصرف مثل تلك مجردة هو مجرد الذهاب إلى خلق عالم من الارتباك بالنسبة لك مزيد من أسفل الخط.

وعلى صعيد آخر، VS المكونات في التصميم هو في كثير من الأحيان ليست واردة على نفس المستوى (وهذا غير منصف قليلا، ولكن يتم تطبيق بالتأكيد أقل دقة مما هو في مرحلة التصميم اللغة - وهي محقة في ذلك). بعض الأدوات VS، مثل مصمم الطبقة والمحررين WPF الحالي، أفكار جميلة ولكن لم يكتمل حقا - حتى الان.

في حالة أنك تصف اعتقد ان لديك حجة عدم استخدام مصمم الدرجة، وليس حجة الإختراق التعليمات البرمجية.

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

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

لاستخدام مللي كمثال ...

مايكروسوفت يفعل ذلك مع القوالب التحكم المستخدم في Silverlight. #if غير مقبولة تماما ومن المشكوك فيه ان والأدوات تغلب عليه في أي وقت قريب. IMHO

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