一、用面向对象模拟男孩子找女朋友 1.男孩子找女朋友 要求: 必须: 1)会洗衣服 2)会做饭 优先: 1)如果有份过万的月薪的工作 2.如果用面向对象来设计这个过程,需要有哪些类 1)男孩子类: 属性: 姓名,年龄,钱,女朋友 行为:谈恋爱 2)然后,是需要女孩子类吗,不是,因为什么样的东西可以成为男孩子的女朋友,是不是只要会洗衣服,会做饭,就可以了,如果有份月薪过万的工作,优先考虑,没说必须是女的吧,那狗呢,是不是如果狗会洗衣服,会做饭,也能当男孩子的女朋友啊,所以接下来要定义的,不是女孩子类,而是一个协议,只要遵守了这个协议,就可以成为男孩子的女朋友,这个协议里有两个方法,洗衣服方法,做饭方法,哪个类想当他的女朋友,是不是只要遵守这个协议,就可以了 3.定义1个协议,就叫女朋友协议吧 洗衣服 做饭 这时候,假如有个女孩子类,这个女孩子想当男孩子的女朋友,是不是只要去遵守这个协议,就可以了吧? 女孩子只要遵守了这个协议,那么女孩子就拥有了洗衣服,做饭的行为了吧 同样道理啊,如果有一个狗类,狗也想当这个男孩子的女朋友,怎么办,让狗遵守这个协议就可以了吧 是不是最好先来个协议啊 所以,我先来个协议 4.女朋友协议:GFProtocol 1)遵守这个协议的东西,注意啊,不是人,都可以当男孩子的女朋友 2)这个协议都有哪些方法呢:洗衣服、做饭,这两个是必须的,所以用@required修饰 @required - (void)wash;//洗衣服的方法 - (void)cook;//做饭的方法 这两个方法务必要有 还有一个可选的方法:用@optional修饰 @optional - (void)job; 这就是:女朋友协议,只要遵守这个协议的东西都可以作为男孩子的女朋友 二、现在我们来定义男孩子类:Boy类 1.在Boy.h文件中 #import <Foundation/Foundation.h> @interace Boy:NSObject //这个Boy呢,他有一些属性吧,一个是姓名,一个是年龄,一个是钱,一个是女朋友 //姓名 @property(nonatomic,strong)NSString *name; //年龄 @property(nonatomic,assign)int age; //这家伙有多少钱 @property(nonatomic,assign)int money; //女朋友,第一,什么东西都可以当他的女朋友,前提是只要遵守什么协议,是不是GF协议就可以了,所以这个指针是什么类型的,id,万物都可以,任意的Objective-C对象是不是都可以,但是,要求这个对象怎么样,是不是遵守GF协议,怎么办,尖尖<协议名>,把这个协议引进来啊,#import “GFProtocol.h”,怎么写: @property(nonatomic,strong)id< GFProtocol > girlFriend; //要加星吗,不要,因为id在typedef的时候,已经有星了 //他有个方法,叫做:谈恋爱talkLove - (void)talkLove; 2.在Boy.m文件中 #import “Boy.h” @implementation Boy //记住,谈恋爱怎么谈的,像下面这样谈的: - (void)talkLove { NSLog(@“哈尼,我回来了。”); //回来以后呢,做什么事情呢 //记住,让他的女朋友,他们谈恋爱嘛,回来之后,让他的女朋友给他洗个衣服,做个饭 //是不是,让他拥有的这个女朋友,_girlFriend,给他洗个衣服,[_girlFriend wash],再让他的女朋友给他做个饭,[_girlFriend cook] [_girlFriend wash]; [_girlFriend cook]; //最后,再打印一句话 NSLog(@“哈尼,明天继续哦。么么哒!”); } 三、我们来试一试啊,在main.m文件中 #import <Foundation/Foundation.h> #import “Boy.h” #import <limits.h> int main(){ Boy *b1 = [Boy new]; //给他赋一些值吧 b1.name = @“李刚”; b1.age = 22; b1.money = INT32_MAX;//这个是一个宏,是我int的最大值,21亿 //重点来了,这个李刚是不是有一个女朋友啊,那问题来了,什么东西才能当李刚的女朋友,是不是只要遵守了GF协议,就可以当李刚的女朋友了 //那我来个类啊,我来个Girl类 1.在Girl.h文件中: #import <Foundation/Foundation.h> #import “GFProtocol.h” @interface Girl : NSObject @property(nonatomic,strong)NSString *name; @end 2.在main.m文件中: #import <Foundation/Foundation.h> #import “Boy.h” #import “Girl.h” #import <limits.h> int main() { Boy *b1 = [Boy new]; b1.name = @“李刚”; b1.age = 22; b1.money = INT32_MAX; Girl *fj = [Girl new];//来个Girl,例如:凤姐 fj.name = @“凤姐”; //好了,现在凤姐说,李刚,李刚,我想当你的女朋友,李刚允许不,不允许,因为凤姐根本就不符合,李刚同学找女朋友的条件,凤姐还没有遵守GF协议呢,不信你试一下啊 b1.girlFriend = fj; //编译一下啊,肯定报警告 //如果凤姐就是要当,老子就是要当你的女朋友,霸王硬上弓,那这个大家思考,会有什么问题 //这个时候,我运行一下,会有问题吗,不会,什么时候会出问题,谈恋爱的时候…… //你看这个时候啊,李刚同学回家谈恋爱了啊 [b1 talkLove]; //你看,李刚同学回家一谈恋爱,他崩了,不信你运行一下,这时候肯定崩了 //为什么会崩了,因为李刚同学贪恋爱的时候,他怎么谈的啊,是不是让他拥有的女朋友,去洗衣服、做饭啊,而这个时候,李刚同学的女朋友,是不是凤姐啊,凤姐会洗衣服、做饭吗,不会啊,所以一谈恋爱,就崩了啊 3.那凤姐说:李刚,我无论如何都要当你的女朋友,那怎么办,是不是凤姐只能去学习洗衣服、做饭啊 如何让Girl对象拥有洗衣服、做饭的行为呢 让这个Girl遵守GF协议就可以了吧 好了,凤姐为了李刚放弃一切啊 在Girl.h文件中 #import <Foundation/Foundation.h> #import “GFProtocol.h” @interface Girl : NSObject < GFProtocol > @property(nonatomic,strong)NSString *name; @end 好了,这个时候,Girl对象一旦遵守了这个协议,这个时候,Girl是不是拥有了这个行为了吧 好了,自己再去实现一下,在Girl.m文件中 #import “Girl.h” @implementation Girl - (void)wash { NSLog(@“亲爱的,衣服洗好了哦。”); } - (void)cook { NSLog(@“亲爱的,饭做好了哦。”); } @end 好了,大家思考一下,这个时候,凤姐能不能当李刚的女朋友了?可以了 编译运行一下,不报错了 输出: 哈尼,我回来了 亲爱的,衣服洗好了哦。 亲爱的,饭做好了哦。 哈尼,明天继续哦,么么哒 三、有个问题大家思考一下,为什么我们要求这个girlFriend必须要遵守GF协议呢 1.原因很简单,因为我们马上要调用这个girlFriend当中的协议方法 只有这个girlFriend遵守了这个GF协议,那个girlFriend里面是不是才有这个wash、cook方法啊 你不遵守那个GF协议的话,你里面一定有这个方法吗,就不一定了啊 四、比如,我再来个Pig类 1.在Pig.h文件中 #import <Foundation/Foundation.h> @interface Pig:NSObject @property(nonatomic,strong)NSString *name; @end 2.在main.m文件中 #import <Foundation/Foundation.h> #import “Pig.h” int main(){ Pig *zhuZhu = [Pig new]; //这时候,这个猪猪能不能作为李刚的女朋友呢? //不可以,比如 b1.girlFriend = zhuZhu ; //这是不行的,一编译,就报大警告 //像刚才说的,就是霸王硬上弓,后果就是谈恋爱,要崩的 //因为谈恋爱的时候,李刚要让他的女朋友猪猪去洗衣服、做饭,而这个时候,猪猪洗不了衣服、做不了饭,谈不了恋爱,你不信,可以试一下啊 [b1 talkLove]; //走一遭,你看,跟猪猪谈恋爱的时候就崩了,因为猪猪没有洗衣服、做饭的行为 //还是那句话,如果猪猪就是相当李刚的女朋友呢 //那就要猪猪遵守GF协议 return 0; } 在Pig.h文件中 #import <Foundation/Foundation.h> #import “GFProtocol.h” @interface Pig:NSObject < GFProtocol > @property(nonatomic,strong)NSString *name; @end 在Pig.m文件中 #import “Pig.h” @implementation Pig //猪猪就有洗衣服、做饭的方法了吧,好了,猪猪来实现一下 - (void)wash { NSLog(@“衣服被我洗好了”); } - (void)cook { NSLog(@“我的饭给你吃,不做了。”); } @end 五、李刚能不能自己当自己的女朋友 1.可以,让自己洗衣服、做饭就可以了吧 2.让自己遵守这个GFProtocol协议 3.在Boy.h文件中 #import <Foundation/Foundation.h> #import “GFProtocol.h” @interface Boy:NSObject < GFProtocol > @property(nonatomic,strong)NSString *name; @property(nonatomic,assign)int age; @property(nonatomic,assign)int money; @property(nonatomic,strong)id< GFProtocol > girlFriend; - (void)talkLove; @end 4.在Boy.m文件中 #import “Boy.h” @implementation Boy - (void)talkLove { NSLog(@“哈尼,我回来了”); [_girlFriend wash]; [_girlFriend cook]; NSLog(@“哈尼,明天继续哦,么么哒”); } - (void)wash { NSLog(@“单身狗的悲哀”); } - (void)cook { NSLog(@“狗也要吃饭”); } @end 在main.m文件中 #import <Foundation/Foundation.h> #import “Boy.h” int main{ Boy *b1 = [Boy new]; b1.name = @“李刚”; b1.age = 22; b1.money = INT32_MAX; b1.girlFriend = b1; [b1.talkLove]; return 0 ; }