هل يمكن للفئة تنفذ في وقت واحد بروتوكول؟
-
11-09-2019 - |
سؤال
إذا كانت الفئة التي أقيمها من خلال فئة تضيف الأساليب التي تفي أيضا بالعقد المحدد بواسطة بروتوكول، أود العلم أن فئة الفئة التي تنفذ البروتوكول، وبالتالي تشير إلى المعالج مسبقا OBJ-C الذي فئة تنفذ بفعالية البروتوكول كذلك.
مثال مندوب (للوضوح، شكرا OLE!):
@protocol SomeDelegate <NSObject>
- (void)someDelegateMessage;
@end
مثال الفئة:
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
ومع التنفيذ النموذجي خلاف ذلك
@implement NSObject (SomeCategory)
- (void)someDelegateMessage {}
@end
عندما أحاول فعلا هذا، أحصل على تحذير لكل طريقة NSOBJECT:
تحذير: تنفيذ غير مكتمل للفئة "Somecategory"
تحذير: تعريف الطريقة ل "-Description" غير موجود
...
تحذير: تعريف الطريقة ل "-عراسك:" غير موجود
تحذير: الفئة "الفئة السمنية" لا تنفذ بالكامل بروتوكول "NSOBJECT"
يعمل بشكل جيد إذا قمت بإزالة <SomeDelegate>
من الإعلان، ولكن بالطبع غير معترف به NSOBJECT
المحلول
الحل البديل هو إعلان البروتوكول على فئة بدون أي تنفيذ، وتنفيذ الطريقة في فئة مختلفة، على سبيل المثال:
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
@implementation NSObject (SomeCategory_Impl)
- (void)someDelegateMessage {}
@end
إذا قمت بذلك، NSObject
سيتم النظر في المطابقة مع <SomeDelegate>
في تجميع الوقت، والتحقق من وقت التشغيل ل someDelegateMessage
ستنجح. ومع ذلك، conformsToProtocol:
سوف تفشل الشيكات وقت التشغيل.
بالطبع، يجب عليك ملف علة طلب هذه الطرق المعلنة على الطبقة الأساسية لا تولد تحذيرات.
نصائح أخرى
أي فرصة إعلان بروتوكولك يشمل NSObject
بروتوكول؟ مثله:
@protocol SomeDelegate <NSObject>
...
هذا هو المكان الذي تأتي فيه التحذيرات لأن فئةك الآن لا تنفذ البروتوكول الكامل. في رمز الاختبار، كتبت للتو، إزالة NSObject
من البروتوكول يزيل تحذيرات المحول البرمجي.
إذا كنت تريد إخراج المحول البرمجي حول الإرسالu003CNSObject> الرسائل (ومن المهم أن تتذكر أن هذا اسم البروتوكول، وليس اسم الفصل) ثم استخدم فقط متغيرات "المعرف"، وليس "معرف" لأن هذا هو الذي تخبره صراحة بالمترجم "هذا هو كائن ينفذ فقط البروتوكول الأحيي" وبعد
بالتناوب، استخدم NSOBJECT كنوع المتغير الخاص بك بدلا من ذلك.