【发布时间】:2011-07-01 22:18:22
【问题描述】:
我有两个 C++ 类:Sequence,就像 std::vector 和 File,它是代表机器上文件的字符串的 Sequence。
从Sequence 派生File 是不费吹灰之力的。它的行为完全相同,但增加了读取和写入文件的功能。 File 特定的功能很容易实现,无需将Sequence 的数据成员标记为受保护。相反,它们可以是私有的,File 可以使用Sequence 的公共接口。快乐时光无处不在。
我想创建一个内部管理动态分配内存的Array 类。 Array 对象无法调整大小;大小在构造函数中指定。*
这是有争议的地方。
从概念上讲,从Array 派生Sequence 是有意义的。正如 File 是 Sequence 具有读取和写入文件的附加功能一样,@987654337@ 是 Array 具有按需调整大小的附加功能。
但有一个关键区别:调整大小功能需要直接访问Array 正在管理的内存。换句话说,以前的私有成员现在必须受到保护。
使用受保护成员而不是私有成员会破坏封装。 Array 和 Sequence 之间的链接是唯一需要它的链接;作品中的其他类可以只使用它们父母的公共接口。从这个意义上说,推导是个坏主意。
您可能会争辩说,想要数组的人可以只使用Sequence 而忽略调整大小的功能。但话又说回来,您可以只使用File 并忽略读/写功能。这就像购买一台笔记本电脑,但从未将其从办公桌上移开。这根本没有意义。
最好的做法是:派生并可能破坏封装;使Array 成为一个完全独立的类,并且必须毫无意义地重新实现很多功能;还是完全忘记Array,让人们使用Sequence?
*请注意,这是一个娱乐和教育项目,因此具有不可调整大小的动态分配数组的实用性无关紧要。
【问题讨论】:
-
“数组”和“序列”是什么关系?您对“Array”的描述只是说它是一个内部管理动态分配内存的类(但它的大小是固定的......?)从那个解释中不清楚为什么这两个类完全相关。
-
@Joseph 我不明白这是怎么回事。
Array只是通过InternalArray = new T[SizeSpecifiedInConstructor]分配空间。Sequence做同样的事情,但它也提供了成员函数来调整InternalArray的大小。
标签: c++ oop inheritance encapsulation