objective c - الحل البديل لإنجاز الخصائص المحمية في Objective-C




properties protected (3)

إذا طلبت الرأي ، فهذا رأيي: إذا قرر المرء تحورك

_myProtectedInt

ربما ينجح على أي حال ، لأنه من الممكن بالتأكيد مع وقت تشغيل Objective-C. باستثناء هذا ، الحل الخاص بك هو موافق تماما.

لقد كنت أحاول إيجاد حل لإعلان الخصائص المحمية في Objective-C بحيث يمكن للفئات الفرعية فقط في التسلسل الهرمي الوصول إليها (للقراءة فقط وليس الكتابة). قرأت أنه لا توجد طريقة موثقة للقيام بذلك لذلك فكرت في هذا الحل البديل وأردت طرح رأي StackOverflow حوله.

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

ClassA.h
ClassA_protected.h
ClassA.m

ثم أي فئة فرعية من هذه الفئة ستكون كالعادة:

ClassB.h
ClassB.m

أولاً ، قمت بإنشاء الواجهة ClassA.h حيث قمت بتعريف متغير int محمي بحيث يمكن لأي فئة فرعية من ClassA الوصول إليها:

@interface ClassA : NSObject{
    @protected
    int _myProtectedInt;
}
@end

الخطوة التالية هي الحل الذي كنت أتحدث عنه. ومع ذلك ، بمجرد قراءتها سترى أنه مستقيم للأمام. أعلنت واجهة ثانية تسمى ClassA_protected.h والتي تعمل في الواقع امتداداً لـ ClassA.h وتسمح لنا بوضع علامة على الخاصية على أنها readonly :

#import "ClassA.h"
@interface ClassA ()
@property (nonatomic , readonly) int myProtectedInt;
@end

الخطوة الأخيرة لإعداد التسلسل الهرمي المحمي هي الإعلان عن تنفيذه في ClassA.m حيث نقوم فقط بتوليف فنادقنا:

#import "ClassA_protected.h"
@implementation ClassA
@synthesize myProtectedInt = _ myProtectedInt;
@end

بهذه الطريقة ، كل فئة تحتاج إلى فئة فرعية من ClassA.h ، ستقوم باستيراد ClassA_protected.h بدلاً من ذلك. لذا فإن الطفل الذي يعجبك ، على سبيل المثال ClassB.h ، سيكون على النحو التالي:

#import "ClassA_protected.h"
@interface ClassB : ClassA
@end

ومثال على الوصول إلى هذه الخاصية من تطبيق ClassB.m :

@implementation ClassB
-(void) method {
    //edit protected variable 
    _myProtectedInt= 1;

    //normal access
    self.muProtectedInt;
}
@end

بالتأكيد ، هذا يعمل بشكل جيد. تستخدم Apple نفس الطريقة على سبيل المثال في فئة UIGestureRecognizer . يجب على UIGestureRecognizerSubclass.h الفرعية استيراد ملف UIGestureRecognizerSubclass.h الإضافي وتجاوز الأساليب التي تم الإعلان عنها في هذا الملف.


من أجل "الخصائص" البسيطة ، استخدم إيفار بدلاً من ذلك. هذا جيد مثل الخصائص لجميع الأغراض العملية.

علاوة على ذلك ، الافتراضي محمي بالفعل.





protected