البرمجة

تجاوز طريقة init الافتراضية في Objective-C باستخدام الاستثناءات

في لغة البرمجة Swift، يُستخدم الأمر “fatalError” كوسيلة فعّالة لرفض تنفيذ طريقة أو دالة لم يتم تنفيذها بعد. وفي المثال الذي قدمته، يتم رفض تنفيذ الدالة “init()” الافتراضية للفئة الفرعية “subClass” باستخدام “fatalError”، مما يجعل البرنامج يتوقف تمامًا في حال محاولة استدعاء هذه الدالة.

ومن ناحية أخرى، في لغة البرمجة Objective-C، يمكن تحقيق نفس الفكرة باستخدام آلية تعود للوراء تُسمى “NSAssert”. هذه الآلية تستخدم للتحقق من صحة تعبير محدد، وفي حال عدم صحته، يتم إطلاق استثناء وقف التنفيذ.

لتحقيق هذا في Objective-C، يمكن تصميم الفئة الفرعية “subClass” كما يلي:

objective
#import @interface SubClass : NSObject @property (nonatomic, strong) NSString *k; - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithKK:(NSString *)kk; @end @implementation SubClass - (instancetype)init { NSAssert(NO, @"init() has not been implemented"); return nil; } - (instancetype)initWithKK:(NSString *)kk { self = [super init]; if (self) { self.k = kk; } return self; } @end

في هذا المثال، تم استخدام “NSAssert” في دالة “init” للتحقق من عدم صحة تنفيذ الدالة، وإذا كان الشرط غير صحيح، يتم إطلاق الاستثناء مع الرسالة المحددة.

وبهذه الطريقة، يمكنك تحقيق نفس التأثير في Objective-C كما هو الحال في Swift باستخدام “fatalError”.

المزيد من المعلومات

في مسعى لتحقيق هدفك في تجاوز طريقة البداية الافتراضية للفئة الأساسية في Objective-C بطريقة تشبه fatalError في Swift، يمكننا النظر في استخدام الاستثناءات وإثارة خطأ (exception handling). في Objective-C، يمكن استخدام الاستثناءات لتحقيق هذا الهدف.

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

objective
// SubClass.h #import @interface SubClass : NSObject - (instancetype)initWithK:(NSString *)k; - (instancetype)init NS_UNAVAILABLE; @end
objective
// SubClass.m #import "SubClass.h" @implementation SubClass - (instancetype)initWithK:(NSString *)k { self = [super init]; if (self) { // Your initialization code here // ... // Check if the superclass's init method is called if ([self isMemberOfClass:[SubClass class]]) { [NSException raise:@"InitializationException" format:@"init() has not been implemented"]; } } return self; } @end

هذا الكود يستخدم استثناء (exception) لرفع خطأ عند استدعاء الدالة init() للفئة الأساسية. يتم ذلك باستخدام [NSException raise:@"InitializationException" format:@"init() has not been implemented"];. يمكنك استبدال “InitializationException” بالاسم الذي يناسبك للخطأ.

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

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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