【问题标题】:Objective-C: Class versus Protocol [duplicate]Objective-C:类与协议 [重复]
【发布时间】:2012-07-20 15:44:40
【问题描述】:

我正在阅读协议(并认为我可以使用它们重写一些代码),但我似乎陷入了到底是什么使它与类不同?

例如,如果我有一个 ColorController 类:

#import <Foundation/Foundation.h>

@interface ColorController : NSObject { 

UIColor* colorToReturn;

}


- (UIColor* ) setColor : (float) red : (float) green : (float) blue; 

@end

和.m

#import "ColorController.h"

@implementation ColorController 


- (UIColor* ) setColor : (float) red : (float) green : (float) blue { 

float newRed = red/255;
float newGreen = green/255;
float newBlue = blue/255;

colorToReturn = [UIColor colorWithRed:newRed green:newGreen blue:newBlue alpha:1.0];

return colorToReturn;
}
@end

然后将其导入另一个类:

ColorController* colorManager = [ColorController new]; 

UIColor* newColor = [colorManager setColor:66.0:66.0:66.0];

这似乎非常适合转换为协议,因为许多其他类可以使用 setColor 方法。但是我不确定我对协议的理解是否有问题,我认为一旦声明了协议,其他类就可以使用它,但是由于您仍然必须将它包含在 .h 文件中,对我来说唯一可辨别的区别是使用协议 setColor 方法可以在我已将协议导入到的任何类中直接调用,而导入类我将不得不回调类和方法 [colorManager setColor:66.0:66.0:66.0];这里的收益究竟是什么?

现在我的观点可能是因为我是一个新手/没有协议经验,并且对它们及其用法的看法有限,所以如果有人可以给我一个简短的(除了“去阅读文档”:D)回复协议的好处,也许还有一个使用示例,我真的很感激。

【问题讨论】:

  • 协议用于委托模式。您看起来不像是想为ColorController 创建委托类的人,但在您的情况下,您可以为-setColor:red:green: 创建一些类方法而不是实例方法。此外,我建议您重构此方法,例如:-colorWithRed:andGreen:andBlue:

标签: objective-c protocols


【解决方案1】:

协议不提供实现,仅提供某些功能的声明。您仍然必须为符合该协议的任何类手动实现函数。 (一个常见的例子是委托模式)。协议类似于 java 中的接口,如果你熟悉的话。

编辑删除死链接

【讨论】:

  • 我很喜欢可可网站,那里有很多好东西。感谢您的链接。
  • 嘿,那么,在所有链接上要求 target="_new" 以便我可以在页面之间切换是不是太多了? :)
  • 看来您对that one 不走运。 :-P。对于它的价值,当我想这样做时......我只需使用中键打开链接。
【解决方案2】:

而且 ObjC 协议很像 Java 接口: - 你不必实现你的协议 - 一个类可以实现多个协议,但只能从一个类继承

因此,如果您希望您的类或协议仅由一个类使用,一个继承了您的大部分行为的子类,那么请创建一个类。但是,如果您希望多个类使用您的类或协议,那么请制定一个协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多