Objective-C协议vs继承与扩展?

问题描述:

我有几个类有差不多相同的代码。它们之间只有一个或两个字符串是不同的。我想要做的是从另一个定义这些函数的类中使它们成为“x”,然后使用常量或其他来定义那些不同的字符串。我不确定是否“x”是继承或扩展或什么。这是我需要帮助的。Objective-C协议vs继承与扩展?

例如:

objectA.m:

-(void)helloWorld { 
    NSLog("Hello %@",child.name); 
} 

objectBob.m:

#define name @"Bob" 

objectJoe.m

#define name @"Joe" 

(我不知道定义字符串是合法的,但这会得到结果e point across)

如果objectBob.m和objectJoe.m不需要定义方法,那么它们将是理想的,只是它们与objectA.m的关系。有没有办法做这样的事情?它有点像协议,除了相反,我想要“协议”来实际定义函数。


如果一切都失败我就做objectA.m:

-(void)helloWorld:(NSString *name) { 
    NSLog("Hello %@",name); 
} 

而且具有其他文件调用该函数(只是#import objectA.m)。

只需在您的子类中创建一个-name方法(您需要一个基类,然后是每个类型的子类)。

然后做:

- (void)helloWorld { 
    NSLog(@"hello %@", [self name]); 
} 

编辑:固定的非objc样方法命名。 再次编辑:固定方法。

+0

+1除了它将通过可可命名标准调用“名称”。 – 2010-06-07 22:03:33

+0

Objective-C getter方法不使用单词get。这只是'[自己的名字]'。以'get'开头的方法表明某个提供的缓冲区正在填充或正在获取远程资源。 – Chuck 2010-06-07 22:04:31

+0

这看起来会很好。可以/我应该将它与一个定义基类所需函数的协议(如名称)结合起来?实际上,“名称”是否需要成为一种方法,或者有没有办法使它成为子类的常量? – RyanJM 2010-06-07 22:27:29

听起来像继承给我。将helloWorld方法定义为NSLog(@"Hello %@", name),并让子类为它们的name实例变量提供不同的值。 (请注意,我正在讨论实例变量,而不是预处理器宏,因此无法用于此目的。)

+0

有没有什么办法摆脱实例变量并使其可用于类方法?或者唯一的方法就是像chpwn一样调用方法吗? – RyanJM 2010-06-07 22:30:54

+0

方法和实例变量是按类自定义行为的唯一方法。为什么你不喜欢使用方法调用? – Chuck 2010-06-07 23:12:14