• 类继承与类组合的选择


    情景描述

          已经定义了一个串口抽象类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扩充一下串口的操作方法,就使用组合的方法。

  • 相关阅读:
    day 46
    day 45 JavaScript 下 函数
    day 42 css 样式
    44 JavaScript
    41 前端
    40 协程 i/0多路复用
    39 线程池 同一进程间的队列
    38 线程 锁 事件 信号量 利用线程实现socket 定时器
    37 生产者消费者模型 管道 进程间的数据共享 进程池
    演示使用string对象
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/13883868.html
Copyright © 2020-2023  润新知