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

上記の例では、OK であり、理にかなっています。しかし、場合によっては、クラスが別のクラスにメッセージを送信する必要があり、他のクラスがこのメッセージを受信することはありません。

// 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 のオブジェクトのプロトコルにするか、このように public メソッドのままにするかです。他の影響はありますか?

4

1 に答える 1

1

どちらの場合でも、プロトコルは使用しません。

最初のケースでは、すべてのサブクラスは学生クラスの直接の階層的な子であるため、学生ヘッダーで関数を定義すると、そのすべてのサブクラスで実装または上書きできます。

学生クラスの子ではないオブジェクトに関数を追加する予定がある場合にのみ、プロトコルにします。

プロトコルのドキュメントを参照してください。ページの上部には、プロトコルが意味のある短いリストがあります: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html

于 2012-11-30T09:42:15.300 に答える