2012-11-30 70 views
0

在我的应用程序中,有一些地方我必须调用其他类中的一组代码。我通常使用协议来做到这一点协议与直接消息在Cocoa Touch

// 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]; 
    } 
} 

的问题是,我应该把拨动进入房间的对象的协议,或将其作为这样一个公共的方法?会不会有其他影响?

回答

1

我不会在这些情况下使用协议。

在第一种情况下,所有子类都是学生类的直接级别子级,所以如果您在学生头文件中定义了函数,那么它可以在其所有子类中实现或覆盖。

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

见协议的文档,在页面的顶部是一个简短的列表,其中协议意义:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html

+0

呀,你犯了一个点,我提出了一个错误的榜样。在我的实际代码中,我遵循完全不同的类。 –