gpt4 book ai didi

oop - 表示派生类上的 "container"派生自基类容器的设计模式

转载 作者:行者123 更新时间:2023-12-01 23:51:26 24 4
gpt4 key购买 nike

我有一个类Track其中包含一组 Point s 并代表人在时间上的位置。为了得到这个结果,我运行了一个结合不同数据的迭代优化例程。为了做到这一点,我延长了 Point上课 OptimizedPoint其中包含用于优化该点和当前值的数据。我还介绍了 OptimizedTrack,它是 OptimizedPoints 的集合。以及与整个轨道相关的优化所需的额外数据。

我对 OptimizedTrack 进行了优化在最后一次迭代中,我返回给用户干净的数据 ( Track ),它只有结果,没有额外的数据。但是,我找不到用 OOP 表达 OptimizedTrack 的方法。在某种程度上是 Track 的扩展并为他们介绍常用的套路。 F.e 获取轨道的长度,这应该对它们都可用,因为它只使用可以在 OptimizedTrack 中找到的数据和 Track

现在我有这样的架构Point{x, y, z}, OptimizedPoint extends Point {additional_data}. Track {array<Point>}, OptimizedTrack {array<OptimizedPoint>, additional_data} .我不明白如何表达OptimizedTrack是 Track 的扩展,因为我无法表达 array<OptimizedPoint>扩展 array<Point> .所以不能介绍一个常用的套路length可以为数组计算,因此也可以从数组计算。

我不坚持我目前的架构。这很可能是错误的,我写在这里只是为了表达我面临的问题。在这种情况下,您建议如何重构我的架构?

最佳答案

如果您遵循被认为是正确使用继承来表达子类型关系的内容,我认为您尝试做的事情的基本前提是错误的。

继承可以用于各种目的,我不想在这个问题上自以为是,但大多数权威人士的意见是,继承在用于子类型化时是最好和最安全的。简而言之,子类的实例应该能够替换其基类的实例而不会“破坏”程序(参见:Liskov 替换原则)。

让我们假设 OptimizedPointPoint 的子类型。然后,当在 OptimizedPoint 的实例上调用时,类 Point 中定义的所有方法将继续按预期运行。这意味着 OptimizedPoint 不能对任何这些方法调用要求任何更严格的先决条件,也不能削弱契约 Point 已经做出的任何 promise 的后置条件。

但这是一个常见的谬误,因为 OptimizedPointPoint 的子类型,是 OptimizedPoint 的容器,即 OptimizedTrack ,是Point容器的子类型,即Track。这是因为您不能用 OptimizedTrack 的实例替换 Track 的实例(因为您无法将 Point 的实例添加到OptimizedTrack 的实例)。

因此,如果您试图遵循“良好的面向对象设计原则”,那么尝试以某种方式使 OptimizedTrack 成为 Track 的子类是灾难性的,因为它肯定永远不可能是子类型。当然,您可以重用 Track 来使用组合构建 OptimizedTrack,即 OptimizedTrack 将包含在 Track 的实例中> length 等方法将被委托(delegate)给哪些方法。

关于oop - 表示派生类上的 "container"派生自基类容器的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63410193/

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