问题标签 [composition]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1644 浏览

clone - 封装聚合/组合

关于封装的维基百科文章指出:

“封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性”

我在一个论坛上开始讨论封装,在其中我问你是否应该总是在 setter 和/或 getter 中克隆对象以保留上述封装规则。我认为,如果您想确保主对象内部的对象不会被主对象外部篡改,您应该始终克隆它。

一位讨论者认为,在这个问题上,您应该区分聚合和组合。基本上我认为他的意思是:

  • 如果要返回一个作为合成一部分的对象(例如,矩形的点),请克隆它。
  • 如果要返回一个属于聚合的对象(例如,作为 UserManager 的一部分的用户),只需在不破坏引用的情况下返回它。

这对我来说也很有意义。但现在我有点困惑。并想听听您对此事的看法。

严格来说,封装总是要求克隆吗?

PS.:我用 PHP 编程,资源管理可能更相关,因为它是一种脚本语言。

0 投票
3 回答
106 浏览

oop - 构成特定对象的激励因素?

我知道有很多原因可以让您将某个对象组合到另一个对象中。一些思想流派已经明确说明了以某种方式构建程序的原因,例如“数据驱动设计”或“领域驱动设计”。我仍然是 OOP 的初学者,而且我通常很难理解为什么一个对象应该包含在另一个对象中。有时,我发现自己有一个看起来很棒的对象,然后我意识到,“好吧,现在我必须它放在某个地方?” 这背后的原因是否类似于我决定将文件放在硬盘上的原因?

为此,我有几个指导原则:

  • 如果它模拟了物理世界中的关系。
  • 如果作曲家有构造对象所需的数据。
  • 如果组合对象将听作曲家。

当你做出这个决定时,你会寻找什么?

0 投票
5 回答
42969 浏览

java - 区分委托、组合和聚合(Java OO 设计)

我面临着一个持续的问题,将委派、组合和聚合彼此区分开来,并确定最好使用一个而不是另一个的情况。

我查阅了一本 Java OO Analysis and Design 书籍,但我的困惑仍然存在。主要的解释是这样的:

委派:当我的对象按原样使用另一个对象的功能而不更改它时。

组成:我的对象由其他对象组成,这些对象在我的对象被销毁 - 垃圾收集后又不能存在。

聚合:我的对象由其他对象组成,即使在我的对象被销毁后也可以存活。

是否有可能有一些简单的例子来展示每个案例,以及它们背后的推理?除了我的对象简单地引用另一个对象之外,这些示例还能如何演示?

0 投票
5 回答
5248 浏览

java - java继承与组合(实现堆栈)

我正在尝试在 java 中实现一个 Stack (使用列表接口:Interface List)。

我想以两种不同的方式实现它:使用组合和继承。

对于继承,到目前为止,我有:

对于作文,我有:

我对从这里去哪里感到困惑。我以前从未使用过接口,所以我应该使用 List 方法来“模仿”堆栈,例如使用 Array 或 ArrayList 吗?

另外,对于组合,我不明白哪些方法应该进入 StackComposition,哪些应该进入 StackViaList。在不完全理解接口以及继承和组合之间,我有点迷茫。我似乎还不能“得到它”……

任何帮助将不胜感激,谢谢!

0 投票
10 回答
26066 浏览

haskell - Haskell 组合 (.) 与 F# 的管道正向运算符 (|>)

在 F# 中,使用管道转发运算符|>, 是很常见的。但是,在 Haskell 中,我只见过函数组合(.), 被使用。我知道它们是相关的,但是在 Haskell 中没有使用管道转发是否有语言原因,还是其他原因?

0 投票
1 回答
1569 浏览

perl - 我应该使用继承还是组合?

我想保持这个简短。我建造了一个有两个房间的 HouseA,比如说BedRoomStudyRoom,它们都派生自一个名为 的基类RoomBedRoomStudyRoom有一个相同的父母称为House. 此外,房屋中的任何房间都只能通过父级访问任何其他房间。如果BedRoom必须访问 的任何属性StudyRoom,则只能通过House(即父级)访问,反之亦然。

现在的问题:假设我建造了另一个家(比如说HouseB),它与上面的完全相同,但有一个变化。我不想要两个单独的房间(即BedRoomStudyRoom),而是一个MasterRoom拥有这两种设施的单人房间( )。为了代码的可重用性,我可以考虑以下设计选项:

在这里,我失去了重用我为BedRoomStudyRoom创建的属性的能力HouseA。注意 和 的大部分属性BedRoom无论如何StudyRoom都需要重新实现MasterRoom,从而导致代码重复。

这样,我使用组合,以便我可以重用我的大部分代码(我有几千行可以重用的代码),但问题是这BedRoom是一个具体的类,logicalBedRoom可能会发现某些属性不合适并且可能被迫覆盖方法,使它们什么都不做。例如,Bedroom->noOfSides() = 4logicalBedRoom->noOfSides() = ??。这是继承的好用吗?

我的实际设计是针对一个复杂的芯片,它结合了两个单独芯片的功能(我使用了 House(主板)和 Room(芯片)类比)。我在面向对象的 Perl 中编码,我非常感谢任何替代设计建议。

谢谢

0 投票
1 回答
660 浏览

objective-c - 如何处理双重组合和继承?

我发现了这个相关的问题:如何将组合与继承一起使用?

我想对 Objective-C 做同样的事情,也就是说 aGenericView知道它的属性obj是 GenericObject,并且 aSpecializedView知道相同的obj属性是 a SpecializedObject

这是一个更清楚的示例:

如您所见,最后我得到一个错误,因为SpecializedView机器属性是 a ElectricalMachine,而不是 a Toaster

非常感谢您的帮助!

老问题

这是我的问题的第一个版本,这可能太神秘了:

我有以下通用观点:

我也有以下专业观点:

我有以下对象:

和以下专门的对象:

假设我希望 GenericView 处理 GenericObject,而 SpecializedView 处理同一个对象,知道它是 SpecializedObject。

让我通过展示实现来解释:

GenericView doSomething

专门查看做其他事情

我将收到以下警告:“GenericObject”可能无法响应“-toastBread”和以下错误:分配中的类型不兼容

这是合乎逻辑的,因为我已将 obj 的类型定义为 GenericObject。我希望能够在 GenericView 中使用来自 GenericObject 的方法,在 SpecializedView 中使用来自 SpecializedObject 的方法。有没有办法精确 obj 必须是 GenericView 中的 GenericObject 才能处理,并且必须是 SpecializedObject 才能在 SpecializedView 中处理,而不添加属性?你会怎么做?

0 投票
2 回答
164 浏览

c# - 带有 RSS Feed 和 FeedItem 类的循环组合模式

我正在设计一个小系统来解析 RSS 提要,我有两个类:Feed 和 FeedItem。

Feed 有 FeedItem,FeedItem 有父 Feed。给 FeedItem 类一个父 Feed 成员会是一个不好的模式:

所以我可以这样做:

还是我应该只通过其父 Feed 获取 FeedItem,以避免这两个类之间的循环引用?

0 投票
4 回答
911 浏览

c++ - C++ 模板化返回

我有一个基于“实体”的程序,它包含“组件”(组合 FTW)。

组件可能包括许多不同的类型,包括脚本、资产等。我想构建一个名为的实体函数

实体具有字符串映射和实际组件,因此可以按类型名称搜索组件。

我想要一个名为

它接受一个字符串和一个类型名称,并返回所请求的类型化组件。

有可能用 C++ 模板做这样的事情吗?以上显然不起作用,我不知道该怎么做。

谢谢

编辑:

我不是在找工厂。

实体持有不同类型组件的实例。目前这是通过

保证其索引相同。可能我稍后会写一张合适的地图。

我只是想让 GetComponent 返回一个正确类型的引用,该引用对 ComponentList 中的 Entity 持有的类型名称已经实例化的组件。

0 投票
2 回答
805 浏览

java - 使用 Eclipse 生成用于组合的代码

有效的 Java以及其他来源表明我们应该考虑使用组合而不是继承。我经常发现自己通过使用装饰器模式并实现将调用委托给包装对象的转发方法来实现这种组合。

但是,我经常发现自己编写了许多简单的转发方法:

无论如何在 Eclipse (3.4.x) 中自动生成这些转发方法?