美文网首页
iOS中的继承

iOS中的继承

作者: 皆为序幕_ | 来源:发表于2018-09-05 15:02 被阅读0次

概念

  • 子类可以直接复用父类中的成员
  • 子类继承父类所有方法的声明和实现 非私有的实例变量以及协议
  • 继承时要在.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];
}

相关文章

  • iOS中的继承

    概念 子类可以直接复用父类中的成员 子类继承父类所有方法的声明和实现 非私有的实例变量以及协议 继承时要在.h中声...

  • IOS手势

    [TOC] ## IOS****手势 学习ios手势,先要了解响应链,ios中只要继承UIResponse对象的都...

  • 事件分发

    在iOS中UIApplication、UIView、UIViewController等继承UIResponder的...

  • iOS中的“多继承”

    OC中是不支持多继承的,但是某些情况下想实现类似多继承的效果怎么办呢?简单的总结了几种实现伪多继承的方法。不对之处...

  • iOS封装、继承、多态

    0、iOS中面向对象3个特征:封装、继承、多态 1、iOS不支持多重继承,需要用遵循多个协议来实现 2、面向对象的...

  • ios触摸事件

    iOS中的事件 响应者对象 - 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收...

  • tableView的cell复用优化

    UITableView是iOS中重要的控件,UITableView继承自UIScrollView,支持垂直滚动,而...

  • UIScrollView的contentSize、content

    在iOS中,UIScrollView(继承UIKit.framework重的UIView)是UIKit.frame...

  • Flutter -- Container

    Container 类似iOS中的UIView,继承自StatelessWidget 布局 如果没有子Widget...

  • Objective-C的本质(5)——Category原理

    参考:iOS-Category原理iOS底层原理总结 - Category的本质 1、load能继承吗 可以继承,...

网友评论

      本文标题:iOS中的继承

      本文链接:https://www.haomeiwen.com/subject/kiejiftx.html