Я думаю, вы можете спросить, как объявить метод, который будет реализован через некоторое время где-нибудь еще.
Способ Objective-C для этого - использовать Протоколы .
Вы объявляете такой протокол, обычно в заголовочном файле
@protocol MyProtocol <NSObject> {
@optional
- (void)optionalMethod;
@required
- (void)requiredMethod;
}
@end
Здесь объявляются два метода, один из которых является необязательным, а другой - обязательным.Чтобы использовать этот протокол, вы декларируете соответствие при объявлении класса, который будет реализовывать протокол
@interface MyConformingClass : NSObject <MyProtocol> {
}
// you don't have to redeclare methods that are declared in the protocol
@end
. Этот новый класс проверяется во время компиляции для реализации requiredMethod
, поэтому он должен его реализовать, но онможете выбрать, следует ли реализовывать optionalMethod
Теперь любой класс, которому требуются экземпляры объектов для соответствия протоколу, может объявить это, например, в интерфейсе
@interface RequiringClass : NSObject {
MyConformingClass <MyProtocol> *conformingClassObject;
}
…
@end
Опять же, это проверяется во время компиляции
Чтобы убедиться, что соответствующий класс реализует методы @optional
, мы можем использовать эту удобную структуру
if [conformingClassObject respondsToSelector:@selector(optionalMethod)] {
[conformingClassObject optionalMethod];
} else {
// Do something here because the optional method isn't provided
}
Примеры этого по всему Какао- этот класс может предоставить список действий, которые он хотел бы передать своему делегату, делегат принимает протокол и предоставляет реализации этих методов делегата.Затем вызывающий объект может проверить, отвечает ли этот делегат на эти методы во время выполнения, как я описал выше, и вызвать эти методы для выполнения действий или предоставить информацию, когда это необходимо.
Это используется довольномного в Objective-C, где классы предоставляют список методов, которые они хотели бы, чтобы какой-то другой класс выполнял, в отличие от виртуальных функций, где класс объявляет функции, для которых подклассы должны предоставлять реализации.Особенно, поскольку Композиция предпочтительнее наследования в языке.Вместо того, чтобы создавать подкласс для обеспечения реализации, вы просто создаете другой класс, который может делать то же самое, и вместо этого добавляете ссылку на него в классе.