首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >iOS中的继承

iOS中的继承

作者头像
xy_ss
发布2023-11-22 08:37:32
发布2023-11-22 08:37:32
5260
举报
文章被收录于专栏:浮躁的喧嚣浮躁的喧嚣

概念

  • 子类可以直接复用父类中的成员
  • 子类继承父类所有方法的声明和实现 非私有的实例变量以及协议
  • 继承时要在.h中声明一下 继承具有单根性和传递性
  • 继承的根类:大多都继承自 NSObject 类,所以在定义一个类时,要继承NSObject 类
  • 继承就是代码优化公共部分交给父类
代码语言:javascript
复制
@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层的时候,你就要好好考虑是否这个继承的方案了
  • 不满足上面一些条件时候

优缺点

  • 优点: 提高代码复用性 可以让类与类之间产生关系,正是因为继承让类与类之间产生了关系所以才有了多态
  • 缺点: 耦合性太强
代码语言:javascript
复制
#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];
}

替代继承解决复用需求的解决方案

  • 使用协议可能会是更好的方案
代码语言:javascript
复制
#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];
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 特点:
  • 继承中方法调用的流程:
  • 适用继承的场合
  • 不适合继承的场景
  • 优缺点
  • 替代继承解决复用需求的解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档