问题标签 [mixins]

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 投票
1 回答
937 浏览

ruby - Ruby Mixins 和实例变量

是否有将参数传递给混合方法的最佳实践方法?

使用 mixin 的类可以设置混合方法期望的实例变量,或者它可以将所有必要的参数作为参数传递给混合方法。

这样做的背景是我们有一个 Rails 控制器来发布内容 - 但其他控制器甚至模型需要能够“充当发布者”,所以我将控制器方法分解为一个模块,我将混合为需要。

例如,这里是来自需要“充当发布者”的 Rails 控制器的代码,它调用了一个混合方法 question_xhtml()...

最终 question_xhtml 需要所有这些东西!这种方法是否合理,或者这样做会更好

...或者是其他东西?

0 投票
1 回答
361 浏览

ruby - 方法中包含 Ruby 模块

在课堂Foo上,我想Bar在某些条件下包含方法:

有没有更简洁(更清晰)的方法来实现include方法中的,而不必在单例类中进行?

0 投票
2 回答
1332 浏览

c++ - 通过模板的 C++ 混合:为什么这不起作用?

我有一个接口,它被实现为具有许多纯虚拟公共方法的抽象基类。这些纯虚函数可以使用模板来实现,因为子类之间的差异并不大——所以我的想法是使用多重继承来混合提供实现的适当模板化的帮助类。但是,编译器抱怨基类是抽象的;它没有考虑 helper mix-in 的实现,因此认为没有实现所需的方法。

例如:

我正在使用 MSC 10.0 (Visual Studio 2010);该代码使用 g++ 4.5 失败并出现类似错误。

Get或者我的项目中的现实世界等价物不能是虚拟的,因为它们是非常小的操作,需要内联以获得足够的性能(想想 put-pixel/get-pixel) - 所以我需要模板化的通用算法而不是通用的通过虚函数调用。

0 投票
1 回答
226 浏览

ruby - 在类定义结束时执行 mixin 方法

我有一个混入,它反映在接收器类上以生成一些代码。这意味着我需要在类定义的末尾执行类方法,就像在这个简单的简化示例中一样:

我想让mixin自动为我做这件事,但我想不出办法。我的第一个想法是添加receiver.print_methodsself.includedmixin 中,但这不起作用,因为我希望它反映的方法尚未声明。我可以include PrintMethods在课程结束时打电话,但这感觉很糟糕。

是否有任何技巧可以实现这一点,所以我不需要print_methods在类定义的末尾调用?

0 投票
2 回答
7975 浏览

scala - Scala中的动态混合 - 有可能吗?

我想要实现的是有一个适当的实施

我可能知道 B 是什么,但不知道 A 是什么(但如果 B 具有 self 类型,那么我可以在 A 上添加一些约束)。scala 编译器对上面的签名很满意,但我还不能弄清楚实现的样子——如果有可能的话。

我想到的一些选择:

  • 使用反射/动态代理。
    • 最简单的情况:A是Java级别的接口+我可以实例化B并且它没有自我类型。我想这不会太难(除非我遇到一些令人讨厌的、意想不到的问题):
      创建一个新的 B (b),以及一个实现 A 和 B 并使用委托给 a 或 b 的调用处理程序的代理。
    • 如果 B 不能被实例化,我仍然可以创建它的子类,并按照上面的描述进行操作。如果它也有一个 self 类型,我可能需要在这里和那里进行一些委托,但它仍然可以工作。
    • 但是如果 A 是一个具体的类型而我找不到合适的接口呢?
    • 我会遇到更多问题吗(例如与线性化相关的问题,或有助于 Java 互操作性的特殊结构)?
  • 使用一种包装而不是 mixin 并返回 B[A],a 可以从 b 访问。
    不幸的是,在这种情况下,调用者需要知道嵌套是如何完成的,如果混合/包装多次完成(D[C[B[A]]]),这可能会非常不方便,因为它需要找到正确的嵌套级别来访问所需的功能,所以我不认为这是一个解决方案。
  • 实现编译器插件。我对它的经验为零,但我的直觉是它不会是微不足道的。我认为 Kevin Wright 的autoproxy插件有一个类似的目标,但它还不足以解决我的问题(还没有?)。

您还有其他可行的想法吗?你会推荐哪种方式?期待什么样的“挑战”?
还是我应该忘记它,因为当前的 Scala 约束是不可能的?

我的问题背后的意图:假设我有一个业务工作流程,但它并不太严格。有些步骤有固定的顺序,但有些没有,但最后都必须完成(或者其中一些需要进一步处理)。
一个更具体的例子:我有一个 A,我可以添加 B 和 C。我不在乎先完成哪个,但最后我需要一个 A 和 B 和 C。

评论:我对 Groovy 了解不多,但突然出现了这个问题,我想它或多或少与我想要的相同,至少是概念性的。

0 投票
4 回答
405 浏览

design-patterns - 单一职责和混合

鉴于Mixins 通常会在一个类中引入新的行为,这通常意味着一个类会有多个行为。

如果一个类有一个单一的责任,这被定义为只有一个改变原因的类。

所以,我可以从两个不同的角度来看

  1. 班级只有一个改变的理由。混入的模块也只有一个改变的理由。如果班级发生变化,只有班级需要重新测试。如果模块被改变,只有模块需要重新测试。因此,SRP 是完整的。

  2. 班级现在有两个改变的原因。如果更改了类,则类和模块都需要重新测试。如果模块被更改,则类和模块都需要重新测试。Henge,SRP 被违反了。

使用 mixins 是否违反了单一职责原则,最终导致系统更难维护?

0 投票
1 回答
987 浏览

scala - 在 Scala 中使用类型参数和 mixin

编辑2:

我通过使用 mixin 和类型参数的组合以及下面的代码,成功地实现了我在使用 RomanNumerals 的练习中想要的类型安全。本质上,它的作用是在导入RomanNumerals我能够编写的所有内容之后L X V I,但不是L LX L X导致我得到一个类型不匹配的编译器错误(因为这些将是罗马数字的非法组合)。现在我想知道这种使用特征、混合和类型参数的方式是否被认为是可以的,或者我是否在滥用语言可以这么说:) 有没有更好的方法来通过一些更简单/更清洁的方式实现相同的类型安全代码?

编辑:

基于 Victors answere 的进一步问题。好的,但是如果我为类型参数添加上限和下限以使 B 成为特征呢?例如

或者B在这种情况下可能仍然是一个类?如果我知道 f 参数也适用于 typeFoo[B] with B怎么办?有没有办法使用它B与返回类型混合?

下面的原始问题

我想混合在 Scala 中创建对象时作为类型参数获得的特征:

这会导致编译错误:

我也试过:

但这不起作用:

有什么办法可以解决这个问题吗?这样withM的返回类型就变成了传入的类型参数Foo with B在哪里BwithM

0 投票
2 回答
153 浏览

ruby - ruby mixins中的奇怪继承

我想知道,为什么包含模块的方法会混入任何后续的类定义中(就好像该类本身包含它一样)?

印刷:

这是预期的行为吗?为什么?

0 投票
2 回答
2233 浏览

c++ - 使用可变参数模板解决 C++ 中的 mixin 构造函数问题

我最近解决了构造函数问题,其中相互装饰的各种混合类(以及最顶层的宿主类)具有不同的构造函数签名。为了在生成的装饰类中维护单个构造函数,并且不添加初始化函数,我找到了以下解决方案。它对 mixin 类的唯一限制是,如果它的构造函数接受多个参数,则它们都应该封装在一个元组中。(使用 g++ 编译此代码需要 -std=c++0x 标志)

我的问题是:
1) 有没有更好、更优雅的方法来用 C++0X 解决这个问题?
2)具体来说,元组真的有必要吗?

0 投票
3 回答
3499 浏览

c# - Mixins 和 .net

究竟是什么混入?
有什么技术可以在 c# 中实现这一点吗?