导出&;破坏封装,还是破坏干燥? 我有两个C++类:序列< /C> >,它就像 STD::vector < /C> >和文件> />代码>,它是表示机器上文件的字符串的序列。< /P>

导出&;破坏封装,还是破坏干燥? 我有两个C++类:序列< /C> >,它就像 STD::vector < /C> >和文件> />代码>,它是表示机器上文件的字符串的序列。< /P>,c++,oop,inheritance,encapsulation,C++,Oop,Inheritance,Encapsulation,从序列导出文件是一件很容易的事。其行为完全相同,但增加了读取和写入文件的功能。文件特定功能易于实现,无需将序列的数据成员标记为受保护。相反,它们可以是私有的,文件可以使用序列的公共接口。到处都是快乐时光 我想创建一个数组类,在内部管理动态分配的内存。无法调整数组对象的大小;大小在构造函数中指定* 这就是事情变得有争议的地方 从概念上讲,从数组派生序列是有意义的。正如文件是一个序列,具有读取和写入文件的附加功能,序列是一个数组,具有按需调整大小的附加功能 但有一个关键区别:调整大小功能需要直接访问

序列
导出
文件
是一件很容易的事。其行为完全相同,但增加了读取和写入文件的功能。
文件
特定功能易于实现,无需将
序列
的数据成员标记为受保护。相反,它们可以是私有的,
文件
可以使用
序列
的公共接口。到处都是快乐时光

我想创建一个
数组
类,在内部管理动态分配的内存。无法调整
数组
对象的大小;大小在构造函数中指定*

这就是事情变得有争议的地方

从概念上讲,从
数组
派生
序列
是有意义的。正如
文件
是一个
序列
,具有读取和写入文件的附加功能,
序列
是一个
数组
,具有按需调整大小的附加功能

但有一个关键区别:调整大小功能需要直接访问
阵列所管理的内存。换句话说,以前的私人成员现在必须得到保护

使用受保护的成员而不是私有成员会破坏封装。
数组
序列
之间的链接是唯一需要它的链接;工作中的其他类只能使用其父类的公共接口。从这个意义上讲,推导是个坏主意

您可能会争辩说,想要阵列的人可以只使用
Sequence
,而忽略调整大小的功能。但是,您也可以只使用
文件
而忽略读/写功能。这就像是买了一台笔记本电脑,却从未把它从办公桌上挪动过。这根本没有道理

最好的做法是:派生并潜在地破坏封装;要使
Array
成为一个完全独立的类,必须毫无意义地重新实现许多功能;还是完全忘记数组
,只让人们使用序列


*请注意,这是一个娱乐和教育项目,因此拥有一个不可调整大小的动态分配数组的实用性是无关紧要的。

好吧,从
数组
中派生
序列
公共继承在您的情况下绝对是个坏主意(从矩形派生正方形)。在面向对象编程中,Sequence不是数组,因为
Array
有一个
Sequence
没有的属性,它是:
数组对象不能调整大小。如果您进行推导,它将打破规则。

在您的情况下,由于您想要实现一些已经存在于另一个类中的功能,我建议您使用private继承(这意味着实现的继承)或组合,例如,将
数组
的实例存储在
序列
的私有区域中,并将其用于内部实现


UPD:然而,使用
数组实现
序列
在我看来也是相当有问题的。创建一个抽象的基类<代码>容器< /代码>,最好是实现代码< >序列< /代码>和<代码>数组< /代码>的共同功能,然后从中导出这两个类。

您可以考虑将问题分成稍微不同的方向。与继承不同的是,这个问题可能可以通过一个模板来解决——具体来说,就是一个管理集合缓冲区的策略模板。您将有(至少)两个实现:一个用于固定分配,另一个用于自动调整大小

这根本不会破坏封装,我能看到两者之间几乎唯一的重叠是初始分配可能是相同的,无论是固定的还是可变的。考虑到这是多么微不足道,我怀疑是否值得花费大量时间或精力来尝试解决它。理论上可能是这样,但至少在一个典型的例子中,我们讨论的是一行代码,而且非常简单


回到继承的问题上,它归结为:这非常像标准的圆形与椭圆形的情况,其中有足够的相似性,一个看起来像另一个,但最终两者都不满足LSP——你不能安全地将两者视为另一个,所以(至少是公共的)继承是不合适的。私有继承不需要遵循LSP,但通常仅在需要/想要重写基类的虚拟函数时才有用,这在这里似乎也不太可能。

我不会在这里使用派生

序列
实际上不是一个
数组
。虽然实际上它们似乎有许多通用的方法,但从设计的角度来看,它们有非常不同的用途和保证

不过,在
序列
中使用
数组
,并让
序列
直接将大量调用(内联)转发到
数组
是有意义的:

template <typename T>
class Sequence
{
public:
  Sequence(): _array(10) {}
  explicit Sequence(size_t n): _array(n) {}

  bool empty() const { return _size == 0; }
  size_t size() const { return _size; }
  size_t capacity() const { return _array.size(); }

private:
  size_t _size; // current size
  Array<T> _array;
}; // class Sequence
模板
类序列
{
公众:
序列():_数组(10){}
显式序列(大小n):\u数组(n){}
bool empty()常量{return_size==0;}
size\u t size()常量{return\u size;}
size_t capacity()常量{return_array.size();}
私人:
size\u t\u size;//当前大小
数组_数组;
}; // 类序列
注意:我在这里假设数组是一次使用所有元素构建的,而序列将一次添加一个元素

同样,这有意义吗