在我的应用程序中,有些地方我必须在其他类中调用一组代码。我通常使用协议来这样做
// 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对象的协议还是将其保留为像这样的公共方法?还会有其他影响吗?
答案 0 :(得分:1)
我不会在任何一种情况下都使用协议。
在第一种情况下,所有子类都是学生类的直接层次结构子类,因此如果您在学生标题中定义函数,则可以在其所有子类中实现或覆盖它们。
如果您计划将该功能添加到不属于学生班级的孩子的对象中,我只会将其作为协议。
请参阅协议文档,页面顶部是协议有意义的简短列表:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html