zoukankan      html  css  js  c++  java
  • 类继承与类组合的选择

    情景描述

          已经定义了一个串口抽象类A,有打开串口(open)、关闭串口(close)、接收一个字节(receivebyte)、发送一个字节(sendbyte)四个方法。现在要定义一个类B,使其有对串口读n个字节(receiveNbytes)、发送n个字节(sendNbytes)的2个方法。该怎么实现这个定义呢?

    方法一(继承):

          类B继承类A,然后再新增读n个字节(receiveNbytes)、发送n个字节(sendNbytes)的两个成员函数。这样以来,这两个函数可以调用基于类A成员的成员函数。

    方法二(组合):

          在类B中,增加一个基于类A的成员,然后再新增读n个字节(receiveNbytes)、发送n个字节(sendNbytes)的两个成员函数。这样以来,这两个函数可以调用基于类A成员的成员函数。

    问题引入:

          显然,方法一和方法二都可以实现目标,但是究竟该怎么选择呢,选择哪一种方式更加合适呢?

    继承与组合的区别:

    继承:

          B is A的关系,表明子类B是父类A的一种派生。比如先定义了一个抽象的串口类A,需要对电脑上不同品牌的串口进行再定义(可能这些串口的波特率、校验功能不同)。这种情况就使用继承的方法,因为不同品牌的串口仍然是串口。

    组合:

          B has A 的关系。表明类B拥有另一个类A。比如先定义了一个抽象的串口类A,而需要定义一个电脑类,电脑上除了串口,还有很多设备。这种情况就使用组合方式来包含串口类以及其他设备的类,共同构成电脑类,因为电脑是拥有串口类的。

          有时候,类B想使用类A的部分方法,而非全部方法,也可以用组合的方式。

    解决开篇引入的问题:

          我们需要定义的类是“需求”是,使其有对串口读n个字节(receiveNbytes)、发送n个字节(sendNbytes)的2个方法,并没有明确其他的限制条件。那么就可以有两种看法对待:

    1.对串口抽象基类A不满意,想要重新定义串口类,增强它的功能,就用继承的方式。

    2.对串口抽象类A满意,但是还想通过另外一个类B扩充一下串口的操作方法,就使用组合的方法。

  • 相关阅读:
    SystemV和BSD的区别
    Linux init 系列一 System V风格
    ps -ef和ps aux的区别
    Linux中/etc/resolv.conf文件简析
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stoc
    在Linux中利用Service命令添加系统服务及开机自启动
    实例具体解释Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
    关于程序性能优化基础的一些个人总结
    C++开发人脸性别识别总结
    double型转换成string型
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/13883868.html
Copyright © 2011-2022 走看看