gpt4 book ai didi

c++ - 派生和破坏封装,还是违反 DRY?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:39 26 4
gpt4 key购买 nike

我有两个 C++ 类:Sequence,就像 std::vectorFile,它是一个 表示机器上文件的字符串序列

Sequence 派生 File 是很容易的事。它的行为完全相同,但增加了读写文件的功能。 File 特定的功能很容易实现,无需将 Sequence 的数据成员标记为 protected 。相反,它们可以是私有(private)的,File 可以使用 Sequence 的公共(public)接口(interface)。到处都是快乐的时光。

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

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

从概念上讲,从Array 派生Sequence 是有意义的。正如 File 是一个具有读写文件功能的 Sequence 一样,Sequence 是一个 Array按需调整大小的附加功能。

但有一个关键区别:调整大小函数需要直接访问 Array 正在管理的内存。换句话说,现在必须保护以前私有(private)的成员。

使用 protected 成员而不是私有(private)成员会破坏封装。 ArraySequence 之间的链接是唯一需要它的链接;作品中的其他类只能使用其父类的公共(public)接口(interface)。从这个意义上说,推导是个坏主意。

您可能会争辩说,想要数组的人可以只使用 Sequence 而忽略调整大小的功能。但话又说回来,您可以只使用 File 并忽略读/写功能。这就像买了一台笔记本电脑,但从未将它从办公 table 上移开。这根本没有意义。

最佳举措是什么:派生并可能破坏封装;使 Array 成为一个完全独立的类,并且必须毫无意义地重新实现很多功能;还是完全忘记 Array 而只是让人们使用 Sequence

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

最佳答案

您可能会考虑从稍微不同的方向切入问题。代替继承,也许这个问题可以用模板来解决——具体来说,一个管理集合缓冲区的策略模板。您(至少)有两种实现方式:一种用于固定分配,另一种用于自动调整大小。

这根本不会破坏封装,而且我能看到两者之间几乎唯一的重叠是初始分配可能大致相同,无论是固定的还是可变的。鉴于这是多么微不足道,我怀疑是否值得花很多时间或精力来尝试将其分解出来。理论上可以,但至少在典型情况下,我们谈论的是一行代码,而且是非常简单的一行代码。

暂时回到继承问题,归结为:这非常类似于标准的圆形与椭圆形的情况,其中有足够的相似性使一个看起来像另一个,但最终都不满足 LSP -- 你不能安全地将其中任何一个视为另一个,因此(至少是公共(public)的)继承是不合适的。私有(private)继承不需要遵循 LSP,但通常仅当/如果您需要/想要覆盖基类的虚函数时才有用,这在这里似乎也不太可能。

关于c++ - 派生和破坏封装,还是违反 DRY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com