概念
- 子类可以直接复用父类中的成员
- 子类继承父类所有方法的声明和实现 非私有的实例变量以及协议
- 继承时要在.h中声明一下 继承具有单根性和传递性
- 继承的根类:大多都继承自 NSObject 类,所以在定义一个类时,要继承NSObject 类
- 继承就是代码优化公共部分交给父类
@interface Phone : NSObject
@property (nonatomic,strong) NSString *name;
- (void)call;
@end
@implementation Phone
- (void)call{
NSLog(@"%s",__func__);
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@", _name];
}
@end
---------------------------
#import "Phone.h"
@interface IPhone : Phone
@property (nonatomic,copy) NSString *type;
@end
#import "IPhone.h"
@implementation IPhone
- (void)call{
NSLog(@"%@ %@打电话",self.name,self.type);
}
@end
特点:
- 使用继承可以实现代码的复用,减少代码冗余
- OC中一个类可以继承另一个类
- 被继承的类称为父类或超类(基类)
- 继承的类称为子类或派生类
- 子类可以直接拥有父类中所有允许子类继承的属性和方法
- 继承关系是可以传递的,子类除了可以调用父类的方法,也可以调用父类的父类的方法,也就是说继承可以确保某个父类型之下的所有类都会有父类型所持有的全部方法
- 子类可以有自己的成员变量、属性和方法
- 单一继承性,OC不支持多继承
继承中方法调用的流程:
首先到子类去找,如果有该方法,就调用子类方法,如果没有,就再到父类去找,如果父类还没有,再到父类的父类去找,如果最后还没有找到,程序会崩溃。
适用继承的场合
- 父类只是给子类提供服务,并不涉及子类的业务逻辑
- 层级关系明显,功能划分清晰,父类和子类各做各的。
- 父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求
- 我们不能脱离cocoa框架开发,所以我们可以继承cocoa的类,以达到快速开发的目的,但是如果没有特殊原因我们写的代码要控制在继承链不超过两层
不适合继承的场景
- 当你发现你的继承超过2层的时候,你就要好好考虑是否这个继承的方案了
- 不满足上面一些条件时候
优缺点
- 优点: 提高代码复用性 可以让类与类之间产生关系,正是因为继承让类与类之间产生了关系所以才有了多态
- 缺点: 耦合性太强
#import <Foundation/Foundation.h>
@interface Phone : NSObject
@property (nonatomic,strong) NSString *name;
- (void)call;
@end
#import "Phone.h"
@implementation Phone
- (void)call{
NSLog(@"%s",__func__);
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@", _name];
}
@end
-------------
#import "Phone.h"
@interface IPhone : Phone
@property (nonatomic,copy) NSString *type;
@end
#import "IPhone.h"
@implementation IPhone
- (void)call{
NSLog(@"%@ %@打电话",self.name,self.type);
}
@end
-------------
#import <UIKit/UIKit.h>
#import "Iphone.h"
int main(int argc, char * argv[]) {
IPhone *phone = [[IPhone alloc]init];
phone.name = @"iphone";
phone.type = @"8";
[phone call];
}
替代继承解决复用需求的解决方案
- 使用协议可能会是更好的方案
#import <Foundation/Foundation.h>
@protocol PhoneCall <NSObject>
- (void)call;
@end
------------------
#import "PhoneCall.h"
@interface Phone : NSObject<PhoneCall>
@end
#import "Phone.h"
@implementation Phone
- (void)call{
NSLog(@"%s",__func__);
}
@end
------------------
#import "PhoneCall.h"
@interface IPhone : NSObject<PhoneCall>
@end
#import "IPhone.h"
@implementation IPhone
- (void)call{
NSLog(@"%s",__func__);
}
@end
--------------
- (void)viewDidLoad {
[super viewDidLoad];
IPhone *phone = [[IPhone alloc]init];
[phone call];
Phone *p = [[Phone alloc]init];
[p call];
}