سؤال

تطبيق iPhone الخاص بي يحتوي على فئة مجردة WorkSview. إنها فئة فرعية من Uiview. سيكون WorkView بدوره مجموعة من الفئات الفرعية الخرسانية. اثنان من هؤلاء سيكونون SimplifyView و MultiplyView.

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

+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
    WorkingView *ret;
    switch (mode) {
        case simplifyMode:
            ret = [[SimplifyView alloc]initWithFrame: frame];
            break;
        case multiplyMode:
            ret = [[MultiplyView alloc]initWithFrame: frame];
            break;
        // additional cases here
        default:
            return nil;
    }
    // more initialization here
    return ret;
}

حتى الان جيدة جدا. لكن هنا تكمن المشكلة. في طريقة init الخاصة بـ SimplifyView ، أحتاج إلى تشغيل الكائن من خلال طريقة init في Uiview. الاتصال [super initWithFrame: Frame] يحصلني فقط على WorkView ، وليس على طول الطريق إلى Uiview. أفترض أنه يمكنني إنشاء initWithFrame: طريقة في WorkView والتي بدورها تستدعي itwithframe من Uiview: طريقة - ولكن هذا يشعر بالاختراق.

ما هي الطريقة المناسبة للتعامل مع هذا؟

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

المحلول

إذا اتصلت [super initWithFrame:frame] من فئتك الفرعية ، سيقوم وقت التشغيل بتسلق التسلسل الهرمي للميراث الذي يبحث عن فئة تنفذ هذه الطريقة ، بدءًا من Super. إذا لم ينفذ Super initWithFrame:, ، سيستمر وقت التشغيل في التسلق حتى يجد في النهاية التنفيذ الافتراضي ويحتجزه في UIVIEW.

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