封装、继承与多态

今天简单总结一下面向对象程序设计的三大特性:封装、继承与多态。

一、封装

隐藏内部实现,稳定外部接口。也就是定义类,定义属性,定义方法。
现在我们来封装一个Person类,继承自NSObject:

#import 

@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];

你可能感兴趣的:(封装、继承与多态)