01).封装
封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。简而言之,信息隐藏,隐藏对象的实现细节,不让用户看到,以此来增强安全性和简化编程,进而达到封装的目的。
使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
访问修饰符:private、protect、public、Internal
private:私有的,不可供外部访问的信息,只有类本身能存取.系统默认@private
protect:受保护的,类和派生类可以存取.
Internal:只有同一个项目中的类可以存取.
Public:外部可以直接访问 person->name = @“jack”;
//封装 (setter和getter)成对出现
- (void)setName:(NSString *)name;//声明
- (NSString *)name;//声明
- (void)setName:(NSString *)name //实现
{
_name = name;
}
- (NSString *)name//实现
{
return _name;
}
[p setName:18];//赋值
[p name]; //取值
//只有getter没有setter,叫做只读封装
扩展:如何让1个方法不被外界访问,只需要在.m文件中实现这个方法,不需要在头文件中定义,即只有实现,没定义.
02).继承
OC 的继承具有 单继承 的特点,每个子类都只能有一个直接父类。然而,他可以有无限多个间接父类。
当子类继承父类时,子类可以得到父类的:
1.全部成员变量
2.全部方法
03).多态
一种事物的多种形态。不同类的对象可以定义共享相同名称的方法,这个就是多态的表现形式。
实现多态的条件:
1.必须存在继承关系
2.子类重写父类的方法
3.父类声明的变量指向子类对象
OC指针类型的变量有两个:编译时类型和运行时类型。编译时类型由声明变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。
父类:动物类 HMAnimal.h
#import <Foundation/Foundation.h>
@interface HMAnimal : NSObject
{
//年龄
int _age;
}
//吃
-(void)eat;
//跑
-(void)run;
@end
父类:动物类HMAnimal.m
#import "HMAnimal.h"
@implementation HMAnimal
//吃
-(void)eat{
NSLog(@"动物在吃");
}
//跑
-(void)run{
NSLog(@"动物会跑");
}
@end
子类:狗狗类 HMDog.h
#import "HMAnimal.h"
@interface HMDog : HMAnimal
//dog类已经有了父类的属性和行为
//狗特有的行为
-(void)lookHome;
@end
子类:狗狗类 HMDog.m
#import "HMDog.h"
@implementation HMDog
//重写父类的方法
-(void)eat{
NSLog(@"狗正在吃芝麻酱和红糖");
}
-(void)run{
NSLog(@"狗一边叫,一边跑");
}
-(void)lookHome{
NSLog(@"狗会看家");
}
@end
运行 main.m
#import <Foundation/Foundation.h>
#import "HMDog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
HMAnimal *ani1 = [HMDog new];//父类指针指向子类对象,这就是多态
[ani1 eat]; //运行结果由实际赋给该变量的对象决定
[ani1 run];
}
return 0;
}
2017-06-20 23:17:15.450844+0800 多态[2295:564455] 狗正在吃芝麻酱和红糖
2017-06-20 23:17:15.451833+0800 多态[2295:564455] 狗一边叫,一边跑