gav*_*kar 4 encapsulation objective-c
如何在类的@implementation中创建一个方法而不在@interface中定义它?
例如,我有一个构造函数,它进行一些初始化,然后从文件中读取数据.我想将文件读取代码分解为一个单独的方法,然后我在构造函数中调用它.我不想在标头中定义此方法,因为它仅对此@implementation上下文是私有的.
这可能吗?
这是我的例子.我有一个小程序,它从文件中读取了Todo任务列表.
这是@interface:
@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
Run Code Online (Sandbox Code Playgroud)
这是@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];
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是不必在界面中定义以下内容:
-(NSArray*)loadListWithName:(NSString*)aName;
Run Code Online (Sandbox Code Playgroud)
Nat*_*ger 10
如果在任何调用它的代码之前放置方法的实现,则不需要在标头中定义它.
因此,在这种情况下,把loadListWithName:前面initListOfName:在@implementation块,这将是很好的.
注意:仅仅因为它没有在头文件中定义并不意味着该方法不能被对象外部的代码调用.Objective-C没有私有方法.
正如Andy在评论中暗示的那样,你可以使用Extensions(看起来像一个没有名字的类别).不同之处在于您必须实现扩展中声明的方法,而编译器不会验证您是否实现了类别中声明的方法.
.H:
@interface MyObject : NSObject
{
NSNumber *number;
}
- (NSNumber *)number;
@end
Run Code Online (Sandbox Code Playgroud)
.M:
@interface MyObject ()
- (void)setNumber:(NSNumber *)newNumber;
@end
@implementation MyObject
- (NSNumber *)number
{
return number;
}
- (void)setNumber:(NSNumber *)newNumber
{
number = newNumber;
}
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2285 次 |
| 最近记录: |