情景描述

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

 

posted on 2020-10-27 11:26  amanlikethis  阅读(331)  评论(0编辑  收藏  举报