سؤال

كيف يمكنني إنشاء طريقة في ristementation من فئة دون تحديدها في Finterface؟

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

هل هذا ممكن؟

ها هي مثالي. لدي برنامج صغير يقرأ قائمة مهام ToDO من ملف.

فيما يلي conterface:

@interface TDTaskList : NSObject {
  NSString* name; // The name of this list.
  NSMutableArray* tasks;  // The set of tasks in this list.
}

-(id)initListOfName:(NSString*)aName;
-(NSArray*)loadListWithName:(NSString*)aName;

@end

وهنا جزء من implementation:

-(id)initListOfName:(NSString*)aName {
  if (self = [super init]) {
    name = aName;

    NSArray* aTasks = [self loadListWithName:aName];
    tasks = [NSMutableArray arrayWithArray:aTasks];
  }

  return self;
}

-(NSArray*)loadListWithName:(NSString*)aName {
  // TODO This is a STUB till i figure out how to read/write from a file ...

  TDTask* task1 = [[TDTask alloc] initWithLabel:@"Get the Milk."];
  TDTask* task2 = [[TDTask alloc] initWithLabel:@"Do some homework."];

  return [NSArray arrayWithObjects:task1, task2, nil];
}

ما أريد القيام به هو ليس يجب أن تحدد ما يلي في الواجهة:

-(NSArray*)loadListWithName:(NSString*)aName;
هل كانت مفيدة؟

المحلول

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

لذلك في هذه الحالة وضعت loadlistwithName: أمام initlistofname: في كتلة implementation وسوف يكون جيدا.

ملحوظة: فقط لأنه لم يتم تعريفه في الرأس لا يعني أن الطريقة لا يمكن استدعاؤها بواسطة الرمز خارج الكائن. الهدف - C ليس لديه طرق خاصة.

نصائح أخرى

كما لم تكن آندي في التعليقات، يمكنك استخدام امتدادات (الذي يشبه فئة دون اسم). الفرق هو أنك يجب تنفيذ الأساليب المعلنة في تمديد بينما لا يتحقق المحول البرمجي من أن تنفذ الأساليب المعلنة في فئة.

.h:

@interface MyObject : NSObject
{
    NSNumber *number;
}
- (NSNumber *)number;
@end

.m:

@interface MyObject ()
- (void)setNumber:(NSNumber *)newNumber;
@end

@implementation MyObject

- (NSNumber *)number
{
    return number;
}
- (void)setNumber:(NSNumber *)newNumber
{
    number = newNumber;
}
@end

يمكنك استخدام التصنيفات:

// In TDTaskList.m
@interface TDTaskList(TDTaskListPrivate)
-(id)initListOfName:(NSString*)aName;
-(NSArray*)loadListWithName:(NSString*)aName;
@end

@implementation TDTaskList(TDTaskListPrivate)

// implementation of initListOfName and loadListWithName ...

@end

لديك اثنين من خيارات معقولة. كلاهما موصوف أساسا بالفعل ولكن IMHO كان غير واضح بعض الشيء أو حتى خطأ واضح.

الفئات ليست واحدة منها كما هي AFAIK يعني لغرض مختلف تماما من كسر التطبيقات في ملفات مصدر متعددة.

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

    1. قم بإزالة تعريف LoadListWithName من رأسك بالكامل
    2. أضف ما يلي إلى المصدر (.m) قبل كتلة implementation
    @interface TDTaskList (PrivateMethods)
    -(NSArray*)loadListWithName:(NSString*)aName;
    @end
    
    @implementation ...
    

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