سؤال

أود مثيل كائن متغير اعتماد البروتوكول.

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer *content <CocosNodeOpacity>;
}

على سبيل المثال أحب أن طبقة كائن إلى اعتماد <CocosNodeOpacity> حتى أستطيع أن أحصل على الطرق

-(GLubyte) opacity;    //and
-(void) setOpacity: (GLubyte) opacity;

مجانا.بناء الجملة هو موضح أعلاه غير صالح.هل من الممكن تحقيق ذلك دون خلق جديد ملف التنفيذ وخلق العرف الكائن ؟ شكرا

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

المحلول

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

@interface Layer : NSObject <CocosNodeOpacity> { ... }

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

إذا كنت لا تحكم مصدر Layer, قد تحتاج إلى استخدام هذا بدلا من ذلك عندما يعلن الخاص بك ايفار:

Layer<CocosNodeOpacity> *content;

علما بأن اعتماد بروتوكول يسمح لك بشكل ثابت نوع المتغيرات مع فئة نوع والحصول على تجميع تحذيرات إذا كانت الأساليب ليست موجودة.ومع ذلك كنت لا تحصل على أساليب "مجانا", منذ كنت لا تزال لديك لتنفيذها.لا يزال الاستخدام الحكيم البروتوكولات و كتابة ثابتة يمكن أن تجعل النظام الخاص بك رمز أكثر قوة و "تفشل بسرعة" من استخدام id كما نوع في كل شيء.أنت تستحق الثناء لا مجرد أخذ الطريق السهل.:-)

عن بعض التفاصيل حول البروتوكولات (بما في ذلك المطلوبة والاختيارية طرق) انظر هذا الجواب.

نصائح أخرى

وبروتوكول في الهدف C يشبه واجهة في جافا. ويحدد البروتوكول مجموعة من الوظائف وبمثابة العقد. انها مثل قوله "أنا أضمن أن كل ما هو هذا الكائن، فقد هذه الأساليب."

وأنت قريب جدا على بناء الجملة في أول كتلة التعليمات البرمجية. سيكون في الواقع أن ننظر بشيء من هذا القبيل:

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer<CocosNodeOpacity> * content;
}

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

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

.

وهناك الكثير من الوثائق لفئات هنا على تجاوز المكدس. مستندات التفاح هي أيضا جيدة جدا. هنا مقال للحصول على انك بدأته:

http://macdevelopertips.com/objective-c/objective-c -categories.html

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