【问题标题】:Objective-C protocol vs inheritance vs extending?Objective-C 协议 vs 继承 vs 扩展?
【发布时间】:2011-02-28 22:08:26
【问题描述】:

我有几个具有几乎相同代码的类。它们之间只有一两个字符串不同。我想做的是从另一个定义这些函数的类中使它们成为“x”,然后使用常量或其他东西来定义那些不同的字符串。我不确定“x”是继承还是扩展或什么。这就是我需要帮助的地方。

例如:

objectA.m:

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

objectBob.m:

#define name @"Bob"

objectJoe.m

#define name @"Joe"

(我不确定定义字符串是否合法,但这说明了重点)

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


如果一切都失败了,我将只制作 objectA.m:

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

并让其他文件调用该函数(仅#import objectA.m)。

【问题讨论】:

    标签: objective-c inheritance extend


    【解决方案1】:

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

    然后做:

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

    编辑:修复了类似非 objc 的方法命名。 再次编辑:固定方法。

    【讨论】:

    • +1,但它会被可可命名标准称为“名称”。
    • Objective-C getter 方法不使用单词get。它只是[self name]。以get 开头的方法表示正在填充某些提供的缓冲区或正在获取远程资源。
    • 看起来效果不错。我可以/应该将它与定义基类所需功能的协议(例如名称)结合起来吗?实际上,“名称”是否需要是一个方法,或者有没有办法让它成为子类的常量?
    • 没有理由不让它成为一种方法,Apple 本身就使用了同样的想法......你可以使用一个非正式的协议,就像我有的那样,或者你可以有一个版本在返回 nil 的基类中,需要重写它才能使该类工作。
    • 感谢您的回复。你也可以为我回答一个相关的问题吗?我把它放在这里:stackoverflow.com/questions/2998903/….
    【解决方案2】:

    对我来说听起来像是继承。将helloWorld 方法定义为NSLog(@"Hello %@", name),并让子类为其name 实例变量赋予不同的值。 (请注意,我说的是实例变量,而不是预处理器宏,它们对此毫无用处。)

    【讨论】:

    • 有什么办法可以摆脱实例变量并使其可用于类方法?还是像 chpwn 这样的方法调用是唯一的方法?
    • 方法和实例变量是按类自定义行为的唯一方法。为什么你不喜欢使用方法调用?
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多