0

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

// 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 对象的协议还是将其保留为像这样的公共方法?会不会有其他影响?

4

1 回答 1

1

在这两种情况下,我都不会使用协议。

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

如果您打算将函数添加到不是学生类的子对象的对象,我只会将其作为协议。

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

于 2012-11-30T09:42:15.300 回答