C++开发中级


841 浏览 5 years, 4 months

4.2 设计多态性的电子表格单元格

版权声明: 转载请注明出处 http://www.codingsoho.com/

设计多态性的电子表格单元格

SpreadsheetCell类急需改变层次结构。让SpreadsheetCell只包含字符串从而限制其范围是一种合理的方法,在此过程中或许应该将其重命名为StringSpreadsheetCell。为了处理双精度值,可以使用第二个类DoubleSpreadsheetCell,这个类从StringSpreadsheetCell继承并以自己的方式提供功能。

下图演示了这一设计,这方法想要通过继承重用代码,因为DoubleSpreadsheetCell是StringSpreadsheetCell的唯一子类,并且利用了StringSpreadsheetCell内建的功能。

如果您实现了图中的设计,您会发现子类将重写大多数(如果不是全部的话)基类的功能。

因为双精度值与字符串的处理方式几乎完全不同,这个关系似乎与最初的理解差别很大。当然,包含字符串的单元格与包含双精度值的单元格存在明显的关系。图中使用的模型在某种意义上暗示DoubleSpreadsheetCell“是一个”StringSpreadsheetCell,在此有一个更好的设计,让这两个类地位同等并且具有一个共同的父类SpreadsheetCell,如下图所示。

图中的设计显示了让SpreadsheetCell层次结构具有多态性的方法。由于DoubleSpreadsheetCell以及StringSpreadsheetCell都是从同一个父类preadsheetCell继承,从其他代码的角度来看,它们是可以互换的。实际上这意味着:

两个子类都支持由基类定义的同一接口(方法集)。

使用SpreadsheetCell对象的代码可以调用接口中的任何方法,而不需要知道这个单元格是StringSpreadsheetCell还是DoubleSpreadsheetCell。

由于虚方法的特殊能力,会根据对象所属的类调用接口中每个方法的正确实例。

其他数据结构(例如前面讲述的Spreadsheet类)可以通过引用父类类型包含多种类型的单元格。