------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
封装
这是面向对象的根本,即一个结构不仅可以有数据成员,也可以有函数成员,可以把一个结构需要的属性以及针对于属性提供的方法封装在一个结构中,这个结构就是类,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,OC中有四种访问权限修饰符:public,protect,private,package,访问权限一次递减的,这样在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装。
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的
NSString *_name;
NSInteger _age;
}
- (void)setName:(NSString *)name; //申明_name的setter方法
- (void)setAge:(int)age; //申明_age的setter方法
- (NSString *)name; //申明_name的getter方法
- (int) age; //申明_age的getter方法
@end
#import "Person.h"
@implementation Person
- (void)setName:(NSString *)name{ //实现_name的setter方法
_name = name;
}
- (void)setAge:(int)age{ //实现_age的setter方法
_age = age;
}
- (NSString *)name{ //实现_name的getter方法
return _name;
}
- (int) age{ //实现_age的getter方法
return _age;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
Person *person = [[Person new];
Person.age = 18; //采用点语法自动替换成[person setAge:18]
Person.name = @”小明”; //采用点语法自动替换成[person setName:@”小明”]
NSLog(@”age = %d,name = %@ ”,person.age,person.name);
//此时点语法将自动替换成getter方法
}
return 0;
}
多态
不同对象可以访问相同方法的能力或现象就叫做多态。
多态的原理:
动态绑定,动态类型能使程序在运行是才确定对象的所属类型。其程序上的体现就是通过父类指针指向不同的子类对象。
多态的条件:
有继承关系,有方法的重写;
父类申明的变量指向子类的对象。
多态的优势:
1、不同的类对象可以使用习惯的调用方式;
2、简化了编程接口;
3、实现类和实例的接口隔离。
//Game.h
#import <Foundation/Foundation.h>
@interface Game : NSObject
@property(nonatomic,assign)NSString* name;
-(void)run;
@end
// Game.m
#import "Game.h"
@implementation Game
-(void)run{
NSLog(@"游戏正在运行!");
}
@end
// LOL.h
#import "Game.h"
@interface LOL : Game
-(void)run;
@end
// LOL.m
#import "LOL.h"
@implementation LOL
-(void)run{
NSLog(@"%@正在运行!",self.name);
}
@end
#import <Foundation/Foundation.h>
#import "LOL.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Game *l = [LOL new]; //定义一个指向LOL的Game对象l
Game *g = [Game new]; //定义一个Game对象g
l.name = @"LOL"; //使用了点语法赋值
[g run]; //调用了Game的run方法
[l run]; //调用了LOL重写的run方法
}
return 0;
}
总结:
在get方法中不能使用self.age = age,因为self.age等价于[self setAge:age],这样就会出现死循环了。
可以使用@property自动生成实例变量与setter与getter方法,这时setter与getter方法可以重写,但不能同时重写。