今天简单总结一下面向对象程序设计的三大特性:封装、继承与多态。
一、封装
隐藏内部实现,稳定外部接口。也就是定义类,定义属性,定义方法。
现在我们来封装一个Person类,继承自NSObject:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *sex;
- (void)work;
@end
#import "Person.h"
@implementation Person
- (void)work
{
NSLog(@"%@正在工作",self.name);
}
@end
二、继承
子类继承父类非私有的实例变量、所有方法的声明和实现以及协议,并且可以增添新的属性以及对父类的方法进行重写或添加。方法重写时如果需要调用父类,使用super关键字。继承具有单根性(不支持多继承)和传递性。通俗地讲就是虎父无犬子,而且青出于蓝而胜于蓝,子子孙孙无穷尽也!
继承的优势在于避免冗余,大大提高了代码的可重用性和可维护性。
接下来我们创建两个Person的子类,分别为Doctor、Teacher:
#import "Person.h"
@interface Doctor : Person
@property (nonatomic, strong) NSArray *patients;
@end
#import "Doctor.h"
@implementation Doctor
- (void)work
{
NSLog(@"%@医生正在治病",self.name);
}
@end
#import "Person.h"
@interface Teacher : Person
@property (nonatomic, strong) NSArray *students;
@end
#import "Teacher.h"
@implementation Teacher
- (void)work
{
NSLog(@"%@老师正在教学",self.name);
}
@end
三、多态
多态就是不同对象对同一方法的不同响应,其建立在继承的基础上(也就是同一父类的两个不同子类调用某个父类的方法,有不同的实现)。
当我们用不同子类的实例对象调用Person的work方法时,输出了不同的Log:
Doctor *david = [[Doctor alloc] init];
david.name = @"David";
[david work];
Teacher *paul = [[Teacher alloc] init];
paul.name = @"Paul";
[paul work];