// // SportProtocol.h // day17 // #import <Foundation/Foundation.h> @protocol SportProtocol <NSObject> //NSObject是默认的协议类,每个协议都要继承NSObject基协议。不写也可以。 // 1.协议只能声明方法, 不能声明属性(跟分类一样) //{ // int _age; //} // 方法声明列表 // 2.注意: 如果没有使用任何关键字修饰协议中的方法, 那么该方法默认就是required的 @required // 如果协议中的方法是@required的, 而遵守协议的类又没有实现该方法, 那么会报一个警告(不是报错) - (void)playFootball; @optional // 可选 // 3.如果协议中的方法是@optional的, 而遵守协议的类又没有实现该方法, 那么不会报警告 - (void)playBasketball; - (void)playBaseball; // 注意:@required和@optional仅仅使用程序员之间交流, 并不能严格的控制某一个遵守该协议的类必须要实现该方法, 因为即便不是实现也不会报错, 只会报一个警告, //废材一个废材一个。废材一个废材一个废材一个废材一个废材一个废材一个。 @end
// // CrazySportProtocol.h // day17 #import <Foundation/Foundation.h> #import "SportProtocol.h" // 4.OC中的协议又可以遵守其它协议, 只要一个协议遵守了其它协议, 那么这个协议中就会自动包含其它协议的声明 @protocol CrazySportProtocol <SportProtocol> // 跳舞 - (void)jumping; @end
// // StudyProtocol.h // day17 #import <Foundation/Foundation.h> @protocol StudyProtocol <NSObject> - (void)study; @end
// // Person.h // day17 #import <Foundation/Foundation.h> #import "SportProtocol.h" #import "StudyProtocol.h" // 3.在OC中一个类可以遵守1个或多个协议 // 注意: OC中的类只能有一个父类, 也就是说OC只有单继承(如果2个父类有同名的方法,那么子类就不知道调用哪个方法了。如果父类和爷爷类有同名的方法,子类调用会先去父类找,找不到再去爷爷类找。) @interface Person : NSObject<SportProtocol, StudyProtocol> @end
// // Person.m // day17 #import "Person.h" @implementation Person - (void)playFootball { NSLog(@"%s", __func__); } //- (void)playBasketball 如果是required,而没有实现, //{ // NSLog(@"%s", __func__); //} // //- (void)playBaseball //{ // NSLog(@"%s", __func__); //} - (void)study { NSLog(@"%s", __func__); } @end
// // Sutdent.h // day17 #import "Person.h" // 5.父类遵守了某个协议, 那么子类也会自动遵守这个协议(也有方法的声明)。 @interface Sutdent : Person @end
// // Sutdent.m // day17 #import "Sutdent.h" @implementation Sutdent - (void)playBasketball { NSLog(@"%s", __func__); } @end
// // main.m // protocol注意点 // #import <Foundation/Foundation.h> #import "Person.h" #import "Sutdent.h" int main(int argc, const char * argv[]) { Person *p = [Person new]; [p playBasketball]; [p study]; Sutdent *stu = [Sutdent new]; [stu playBasketball]; return 0; }
时间: 2024-11-06 04:18:54