一、继承

不恰当的使用继承导致的最大的一个特征就是高耦合。

是否使用继承需要考虑三个点:

  1. 父类只是给子类提供服务,并不涉及子类的业务逻辑
  2. 层级关系明显,功能划分清晰,父类和子类各做各的。
  3. 父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求

万不得已不要用继承,优先考虑组合等方式。

  • 如果只是共享接口,我们可以使用协议;

    @protocol ptc <NSObject>
    - (void)do;
    @end @interface A : NSObject<ptc>
    @end @implementation A
    - (void)do
    {
    }
    @end @interface B : NSObject<ptc>
    @end
    @implementation B
    - (void)do
    {
    }
    @end
  • 如果希望共用一个方法的部分实现,但希望根据需要执行不同的其他行为,我们可以使用代理或者 AOP;

    @protocol ptc <NSObject>
    - (void)do;
    @end @interface A : NSObject
    @property (nonatomic, weak) id<ptc>delegate;
    @end @implementation A
    - (void)func
    {
    ...
    [self.delegate do];
    ...
    }
    @end @interface B : NSObject <ptc>
    @end @implementation B
    - (void)do
    {
    }
    @end
  • 如果是添加方法,我们可以优先使用类别;

  • 如果是为了使用一个类的很多方法,我们可以使用组合来实现。

    @interface A : NSObject
    - (void)methodA;
    @end @interface B : NSObject
    -(void)methodB;
    @end // 定义 C 以及其需要的 methodA,methodB
    @interface C : NSObject
    {
    A * __a;
    B * __b;
    }
    - (id)initWithA:(A *)a b:(B *)b;
    - (void)methodA;
    - (void)methodB;
    @end @implementation ClassC
    - (id)initWithA:(A *)a b:(B *)b
    {
    __a = [[A alloc] initWithA:a]; // [A copy];
    __b = [[B alloc] initWithB:b]; // [B copy];
    }
    - (void)methodA
    {
    [__a methodA];
    }
    - (void)methodB
    {
    [__b methodB];
    }
    @end

如果只是出于代码复用的目的而不区分类别和场景,就采用继承是不恰当的。当你发现你的继承超过 2 层的时候,你就要好好考虑是否这个继承的方案了,第三层继承正是滥用的开端。

二、多态

使用场景:

  1. 父类有部分public的方法是不需要,也不允许子类覆重
  2. 父类有一些特别的方法是必须要子类去覆重的,在父类的方法其实是个空方法
  3. 父类有一些方法是可选覆重的,一旦覆重,则以子类为准
  4. 父类有一些方法即便被覆重,父类原方法还是要执行的

通常带来的问题:

  • 容易使得一个对象引入原本不属于它的业务逻辑
  • 调用时机或忘记调用

解决方案:

  • 面向接口编程(Interface Oriented Programming, IOP)

在决定是否采用多态时,要有一个清晰的角色概念,做好角色细分,不要角色混乱。

三、封装

将相关的一堆函数和一堆对象放在一起,只留给外部程序员操作方式,而不暴露具体执行细节。

带来的问题:

  1. 制约了并行程度
  2. 数据部分就是数据部分,执行部分就是执行部分,不同类的东西放在一起是不合适的

四、内容来源

casatwy & 跳出面向对象思想(一) 继承

跳出面向对象思想(二) 多态

跳出面向对象思想(三) 封装

iOS架构师之路:慎用继承

iOS 继承的更多相关文章

  1. ios 继承UITableViewController,更改tableview样式

    // 继承UITableViewController,更改tableview样式 - (instancetype)initWithStyle:(UITableViewStyle)style { ret ...

  2. ios 继承关系图

  3. IOS入门之Swift语言(一)

    经过不断的努力,小哥也买了台苹果设备,终于可以开始我的IOS之旅了,说来确实令人苦恼,为了学习IOS我这着贫农阶级,省了几个月的零花钱,外加向亲朋好友求救,最终痛下心扉,卖了台MAC pro128G版 ...

  4. iOS项目开发日常之创建文件(协议、类、分类、扩展)

    iOS项目开发过程中,是以不断创建文件的形式进行着的. 创建得比较频繁的文件类型是: 这两个类型中创建的文件有:子类.分类.扩展.协议四种文件,如下:    这四类文件是频繁创建的,我们来看一下各自分 ...

  5. 字符串流sstream[part1/基本知识]

    C++中的输入输出分为三种:基于控制台的I/O,即istream.ostream.iostream:基于文件的I/O,即ifstream.ofstream.fstream:基于字符串的I/O,即ist ...

  6. C++ stringstream介绍,使用方法与例子

    From: http://www.usidcbbs.com/read-htm-tid-1898.html C++引入了ostringstream.istringstream.stringstream这 ...

  7. stringstream

    C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件. istringstream类用于执行C++ ...

  8. C++ 系列:iostream 的用途与局限

    转载自http://www.cnblogs.com/Solstice/archive/2011/07/17/2108715.html 本文主要考虑 x86 Linux 平台,不考虑跨平台的可移植性,也 ...

  9. 30分钟学会Objective-C

    注: 本文首发于我的个人博客:https://evilpan.com/2019/04/05/objc-basics/ 请原谅我的标题党.但是如果你有其他语言的学习经验,要学习Objective-C的语 ...

随机推荐

  1. cooking和session

    ## Cookie ## # 基本概念: >> 用于保存一次会话中的记录,存放在客户端(浏览器); |-- "一次会话" |-- 当客户端打开一个界面时 被称作一次会话 ...

  2. 前端每日实战:92# 视频演示如何用纯 CSS 创作一颗逼真的土星

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/EpbaQX 可交互视频 此视频是可 ...

  3. crypto-js aes加密解密

    安装 npm install crypto-js --save unit.js import CryptoJS from "crypto-js"; //秘钥 const CRYPT ...

  4. 那些年,我的前端/Java后端书单

    全文为这些年,我曾阅读.深入理解过(或正在阅读学习.即将阅读)的一些优秀经典前端/Java后端书籍.全文为纯原创,且将持续更新,未经许可,不得进行转载.当然,如果您喜欢这篇文章,可以动手点点赞或者收藏 ...

  5. Windows环境下docker的安装与配置

    Docker是一种容器技术,可以在操作系统中隔离出若干个独立的程序运行环境,这些环境既可以共享宿主机的资源,另一方面他们之间相互独立,互不影响,也不会对宿主机的环境产生影响.与虚拟化技术不同的是,Do ...

  6. 大型Java进阶专题(二) 软件架构设计原则(上)

    前言 ​ 今天开始我们专题的第一课了,也是我开始进阶学习的第一天,我们先从经典设计思想开始,看看大牛市如何写代码的,提升技术审美.提高核心竞争力.本章节参考资料书籍<Spring 5核心原理&g ...

  7. 机器学习 - LSTM应用之sequence generation

    概述 LSTM在机器学习上面的应用是非常广泛的,从股票分析,机器翻译 到 语义分析等等各个方面都有它的用武之地,经过前面的对于LSTM结构的分析,这一节主要介绍一些LSTM的一个小应用,那就是sequ ...

  8. windows上用putty从linux上下载文件

    我之前使用putty都是直接从网上下的putty.exe,其实如果想下载windows的mis二进制文件,系统安装的话会包含,pscp.psftp.puttygen等一系列的文件. 今天下从服务器上, ...

  9. Excel之在单元格中生成随机密码

    公式 =CHAR(INT(RAND()*26+97))&INT(RAND()*10)&CHAR(INT(RAND()*26+97))&INT(RAND()*10) 分析 CHA ...

  10. Java多线程并发01——线程的创建与终止,你会几种方式

    本文开始将开始介绍 Java 多线程与并发相关的知识,多谢各位一直以来的关注与支持.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程的创建方式 在 Java 中,用户常用的主动创建 ...