问题标签 [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 投票
32 回答
396723 浏览

language-agnostic - 更喜欢组合而不是继承?

为什么更喜欢组合而不是继承?每种方法都有哪些取舍?什么时候应该选择继承而不是组合?

0 投票
7 回答
1514 浏览

components - 将对象建模为“组件集合”的游戏引擎在运行时如何工作?

我正在编写一个轻量级游戏引擎,并且在为它做一些研究的同时,我遇到了许多令人信服的文章,它们提倡通过“组件集合”模型而不是“从具体类继承”模型来实现游戏对象。有很多优点:

  • 可以使用数据驱动设计技术组合对象,允许设计人员在不涉及程序员的情况下提出新对象;
  • 源文件依赖项往往更少,从而可以更快地编译代码;
  • 整个引擎变得更加通用;
  • 可以避免必须更改继承层次结构较高的具体类的不可预见的后果;
  • 等等。

但是系统的某些部分仍然不透明。其中主要是同一对象的组件如何相互通信。例如,假设在游戏中模拟子弹的对象是根据以下组件实现的:

  • 一些用于视觉表示的几何图形
  • 世界地位
  • 用于与其他对象碰撞的体积
  • 其他事情

在渲染时,几何图形必须知道它在世界中的位置才能正确显示,但它如何在对象中的所有兄弟组件中找到该位置?并且在更新时,碰撞体积如何找到对象在世界中的位置以测试它与其他对象的交集?

我想我的问题可以归结为:好的,我们有由许多组件组成的对象,每个组件都实现了一些功能。这在运行时工作的最佳方式是什么?

0 投票
12 回答
18570 浏览

inheritance - 面向对象的最佳实践——继承 v 组合 v 接口

我想问一个关于如何处理简单的面向对象设计问题的问题。对于解决这种情况的最佳方法,我有一些自己的想法,但我很想听听 Stack Overflow 社区的一些意见。相关在线文章的链接也值得赞赏。我正在使用 C#,但问题不是特定于语言的。

假设我正在编写一个视频商店应用程序,其数据库有一个Person表,其中包含、PersonIdName字段。它还有一个表,它有一个链接到 a ,还有一个表也链接到。DateOfBirthAddressStaffPersonIdCustomerPersonId

一个简单的面向对象的方法是说Customer“是” Person,因此创建类有点像这样:

现在我们可以编写一个函数来向所有客户发送电子邮件:

这个系统运行良好,直到我们有一个既是客户又是员工的人。假设我们真的不希望我们的everyone列表中有两次相同的人,一次作为 aCustomer一次作为 a Staff,我们是否可以在以下之间做出任意选择:

显然只有这两个中的第一个不会破坏该SendEmailToCustomers功能。

那你会怎么做?

  • 使类具有对 a和类Person的可选引用?StaffDetailsCustomerDetails
  • 创建一个新类,其中包含一个Person,加上可选StaffDetailsCustomerDetails
  • 让所有东西都成为一个接口(例如IPerson, IStaff, ICustomer)并创建三个实现相应接口的类?
  • 采取另一种完全不同的方法?
0 投票
8 回答
1060 浏览

algorithm - 音乐表演中的元作曲

几周前,我和我的钢琴老师在元创作音乐软件方面相互交流。想法是这样的:

有一个系统从一堆乐器中获取 midi 输入,并将输出推送到扬声器和灯光。在这个系统上运行的软件会分析它获取的 MIDI 数据,并根据作曲家设置的触发器确定要使用的声音(当我在 2 秒内弹奏 F7 和弦 3 次时,从大键琴声音切换到钢琴声音)、踏板或音乐的实际实时分析。它将根据乐器的性能和声音以类似的方式控制灯光——音乐家只需要模糊地指定他们想要的东西——剩下的就是实时分析他们的演奏。动态生成的音乐也可以与音乐家一起演奏。本质上,该软件将与表演者一起演奏,一个指导另一个。

我是即兴爵士乐的忠实粉丝。其他艺术形式所缺乏的即兴表演的一个特点是它的时间性。一幅画可以在画完 10 年或 1000 年后被欣赏,但音乐(尤其是即兴音乐)是关于表演的,因为它是创作。我认为我描述的软件会大大增加表演,因为每次播放完全相同的乐曲都会导致完全不同的表演。

所以,现在回答问题。

我疯了吗?

是否存在执行任何或所有这些操作的软件?我做了一些研究,没有发现任何东西。这个系统的关键是它在演出期间运行。

如果我要写这样的东西,像 Python 这样的脚本语言会足够快来完成我需要的计算吗?大概它会在一个相当快的系统上运行,并且可以利用英特尔不断发布的 2^n 核心处理器。

你们中的任何人都可以分享有关与乐器和灯光等接口的经验和建议吗?

有什么想法或建议吗?冷酷严厉的批评?

感谢您花时间阅读本文,以及所有建议!(对于标签中的笑话,我无法抗拒。)

0 投票
6 回答
523 浏览

java - 组合语法会成为 Java 的有用补充吗?

首先,我对语言理论几乎一无所知,除了 Java 之外我几乎不知道任何其他语言,但我有一个我认为很酷的想法,但我需要你们告诉我:
a:为什么它很烂
b:语言 x 多年来是如何做到的
c:我的思想多么糟糕
d:以上所有

这个想法将使组合具有与代码重用相同的便利性extends

因此,如果您有这样的课程:

然后你有一个这样的课程:

然后你就可以这样做了:

无需在 B 类中添加委托。但是你也可以像继承一样做同样的事情,即:

缺点包括:

  • 方法隐藏在源代码中,使得调用的来源不太明显,但情况也是如此extends
  • 如果组合字段共享相同的方法签名,则需要解决冲突(冲突接口如何解决这个问题?)
  • 如果您想拥有多个相同类型的组合字段,那么委托给哪个字段将会有明显的冲突
  • 可能还有 100 件我没想到的事情

就像我说的,我显然不是语言理论家,而且我还没有花很多时间思考这个问题,这个想法突然出现在我的脑海中,我想知道我错了多少。我只是觉得这会很酷。

0 投票
8 回答
10103 浏览

oop - “是”与“有”:哪个更好?

投资组合 A → 基金 1

投资组合 A → 基金 2

投资组合 A → 基金 3

如果不使用 is/has,我无法构筑我的句子。但在 1 和 2 之间,

1)有一个:

2)是一个:

从可扩展性和可用性的角度来看,您认为哪一个更好?我仍然可以通过任何一种方式访问​​我的资金,尽管有一点语法上的改变。

0 投票
10 回答
1069 浏览

oop - 如何将组合与继承结合使用?

我将尝试在一个简单的例子中提出我的问题......

假设我有一个抽象基类 Car。汽车有一个基本的引擎对象。我在抽象 Car 类中有一个方法 StartEngine() ,它将引擎的启动委托给 Engine 对象。

如何允许 Car 的子类(例如 Ferrari)将 Engine 对象声明为特定类型的引擎(例如 TurboEngine)?我需要另一个汽车类(TurboCar)吗?

我继承了一个普通的旧 Engine 对象,我无法在我的 Car 子类中将它重新声明(或覆盖)为 TurboEngine。

编辑: 我知道我可以将 Engine 的任何子类插入到我的 Ferrari 类中的 myEngine 引用中......但是我怎样才能调用只有 TurboEngine 公开的方法?因为 myEngine 是作为基础引擎继承的,所以不包括任何涡轮增压的东西。

谢谢!

0 投票
6 回答
3816 浏览

c++ - 如何将方法结果作为参数传递给 C++ 中的基类构造函数?

我试图实现这样的目标:

现在,这不能按我的意愿工作,因为在初始化 foo 之前在 Derived 构造函数中调用了 bar() 。

我考虑添加一个类似于 bar() 的静态函数,它以 foo 作为参数 - 并在初始化列表中使用它,但我想我会问是否有任何其他技术可以用来从这个中挖掘自己。 ..

编辑:感谢您的反馈 - 这是我将如何处理静态函数。不确定静态和非静态函数之间的重载是否太聪明了,但是......

0 投票
4 回答
5833 浏览

function - 如何用任意数量的函数组成`not`?

当我有一些类型的功能时

我想要用 not 包装这个函数的 make 函数。

例如制作这样的功能

我可以使组合器像

但我不知道怎么做。

我究竟做错了什么?

还有一个额外的问题,我如何为具有更多和更少参数的函数做到这一点,例如

0 投票
4 回答
3211 浏览

asp.net-mvc - ASP.NET MVC 中的 UI 组合

您将如何在 ASP.NET MVC 视图中支持外部可组合部件?

我这是什么意思?想想“每个页面上的登录框”或“iGoogle”。这是需要在每个控制器/视图外部的某些地方的东西。

一种方法是在视图中添加组件,如下所示:

在上面的示例中,我正在寻找一种让每个组件的控制器而不是显示它们的视图的控制器传递视图名称和视图数据的好方法。您可以建议的任何完全不同的解决方案也会很有趣。过滤器、WebForms 等

更新:我将尝试用一个例子来解释我想要理解的内容。我将选择登录功能。

在典型的 webforms 应用程序中,这可能是一个用户控件,它在页面生命周期的加载事件中检索适当的数据并更新一些 UI 控件。单击页面后,页面将回发,我们可以对同一用户控件中单击事件中发布的信息采取行动。

根据我目前对 ASP.NET MVC 样式的理解,首先接受请求的控制器将检索适当的数据并将其传递给视图,该视图又将其传递给登录部分视图。登录视图将定义一个表单,其发布操作针对登录控制器的登录操作。发布的信息由登录操作使用,我们可以选择使用一些漂亮的方案将请求传递给原始控制器。

我假设有一种比上面更聪明的方法,不需要我将控制器逻辑放在视图/母版页中。