Cocoa Touch中的协议与直接消息

时间:2012-11-30 09:18:36

标签: iphone objective-c cocoa protocols public-method

在我的应用程序中,有些地方我必须在其他类中调用一组代码。我通常使用协议来这样做

// Teacher.m
@protocol TeacherProtocol
- (void)assignHomeWork;
- (void)respondToAssingment;
@end

for (Student *student in self.studentInClass) {
    [student assignHomeWork];
}

// Student.m <TeacherProtocol>
- (void)assignHomeWork {
    [self receivedAssignmentPaper];
}

// Nerd.m : Student 
- (void)assignHomeWork {
    [super assignHomeWork];
    [self listenWithAttention];
}

// Douchebag.m : Student
- (void)assignHomeWork {
    [super assignHomeWork];
    [self listenToHisIPod];
}

// Blonde.m : Student
- (void)assignHomeWork {
    [super assignHomeWork];
    [self makeUp];
}

在上面的例子中,它确定并且确实有意义。但是,在某些情况下,该类应该向另一个人发送消息,并且永远不会有任何其他类接收此消息。

// Room.m
- (IBAction)mainSwitchWasToggle:(id)sender {
    [self.mainLightBulb toggle];
}

// MainLightBulb.m
- (void)toggle {
    if ([self.bulb isTurnOn]) {
        [self.bulb turnOff];
    } else {
        [self.bulb turnOn];
    }
}

问题是,我应该将切换转换为Room对象的协议还是将其保留为像这样的公共方法?还会有其他影响吗?

1 个答案:

答案 0 :(得分:1)

我不会在任何一种情况下都使用协议。

在第一种情况下,所有子类都是学生类的直接层次结构子类,因此如果您在学生标题中定义函数,则可以在其所有子类中实现或覆盖它们。

如果您计划将该功能添加到不属于学生班级的孩子的对象中,我只会将其作为协议。

请参阅协议文档,页面顶部是协议有意义的简短列表:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html