【问题标题】:Protocol vs Direct Message in Cocoa TouchCocoa Touch 中的协议与直接消息
【发布时间】:2012-11-18 11:49:12
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,你说得有道理,我举了一个错误的例子。在我的实际代码中,我使协议符合完全不同的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多