问题标签 [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 回答
1803 浏览

inheritance - scala中的自类型继承

假设我具有以下特征:

编译器错误:illegal inheritance; self-type C does not conform to B's selftype B with A
正如预期的那样,如果我取消注释 self 类型注释,编译器会很高兴。

我认为很明显为什么 C 也需要这种 self 类型。我不明白为什么如果编译器已经知道它需要它,它为什么不能从 A “继承”它?

我认为当你使用具有复杂层次结构的 self 类型时,它可以减少冗长,特别是如果你混合一大堆特征,每个特征都有自己的 self 类型。

我想目前的行为可能有充分的理由,我只是找不到/弄清楚它是什么。

起初我认为它可能与 mixin 线性化有关,但在我看来它在这里不起作用(即使我有更多的特征与更复杂的自我类型混合)。

在某些情况下会引起歧义吗?如果是这样,为什么在没有歧义的情况下它不能工作?

还是与正确实施的一些困难有关?

我可以找到有关该主题的一些讨论(例如self type is not dedicated),但他们大多只是陈述问题并得出结论,没有太多解释和/或解决方案(如果存在)。

0 投票
2 回答
9368 浏览

scala - Mixins 与 Scala 中的组合

在 Java 世界中(更准确地说,如果您没有多重继承/混合),经验法则非常简单:“优先考虑对象组合而不是类继承”。

我想知道如果您还考虑mixins,它是否/如何改变,尤其是在scala中?
mixins 是否被认为是一种多重继承或更多类组合的方式?
是否还有“优先对象组合优于类组合”(或相反)指南?

当对象组合也可以完成这项工作时,我看到了很多例子,当人们使用(或滥用)mixin 时,我并不总是确定哪个更好。在我看来,你可以用它们实现非常相似的东西,但也有一些区别,一些例子:

  • 可见性 - 使用 mixins,一切都成为公共 api 的一部分,而组合则不是这样。
  • 冗长 - 在大多数情况下,mixin 不那么冗长并且更易于使用,但并非总是如此(例如,如果您还在复杂的层次结构中使用 self 类型)

我知道简短的回答是“视情况而定”,但可能有一些典型的情况是这样或那样更好。

到目前为止我可以提出的一些指导方针示例(假设我有两个特征 A 和 B,并且 A 想要使用 B 中的一些方法):

  • 如果你想用 B 中的方法扩展 A 的 API,那么 mixins,否则组合。但是,如果我正在创建的类/实例不是公共 API 的一部分,它也无济于事。
  • 如果您想使用一些需要混合的模式(例如Stackable Trait Pattern),那么这是一个简单的决定。
  • 如果你有循环依赖,那么带有 self 类型的 mixin 会有所帮助。(我尽量避免这种情况,但这并不总是那么容易)
  • 如果您想要一些动态的运行时决定如何进行组合,然后是对象组合。

在许多情况下,mixin 似乎更容易(和/或不那么冗长),但我很确定它们也有一些陷阱,比如“上帝类”和两篇 artima 文章中描述的其他内容:第 1部分,第 2 部分(顺便说一句在我看来,大多数其他问题与 scala 无关/不那么严重)。

你有更多这样的提示吗?

0 投票
1 回答
701 浏览

castle-dynamicproxy - 如何将接口聚合到城堡动态代理中

我想在我的代码库中允许声明式 mixin 管理。我想声明一个接口

所以我的类只能消耗他们需要的数据访问层的位。在我的 IoC 容器中,我想将这些接口的实现聚合到一个实例中。但是,当我执行与引用线程类似的操作时,生成器会抛出一个异常,指出接口在多个地方实现。除了实现自己的拦截器并通过之外,我还能做什么?

相关主题:


更好的例子(代码墙)

投掷

0 投票
3 回答
217 浏览

c++ - 在 C++ 中创建一个 SingletonMixin 类

我有四个班级,我们称之为 S1、S2、S3 和 S4。这些类是单例;每个都有一个 getInstance 和一个 finalize 方法 - 以及一个实例私有变量。

现在,为了避免重复 finalize 和 getInstance 方法,我正在尝试创建一个 SingletonMixin 类,例如:

这里的问题是:如何实例化单例类并保持其构造函数私有?


编辑

(澄清)

我的意思是,我该怎么做:

但使用私有 T 构造 T()


谢谢!

0 投票
1 回答
809 浏览

ruby-on-rails - 将公共属性注入活动记录类的正确方法是什么?

我计划使用这个模块(完整的例子在这里http://pastie.org/1098444

但似乎这些值并没有到达模型。

ActiveRecord::StatementInvalid: SQLite3::ConstraintException: categories.name 不能为 NULL: INSERT INTO "categories" ("created_at", "updated_at", "id") VALUES ('2010-08-15 23:20:43' , '2010-08-15 23:20:43', 980190962)

这是否是一种有效的方法,如果不是,怎么可能做到这一点?如果确实如此,我的错误是什么?

失败的单元测试

结尾

一些痕迹

test_can_be_created(TileTest): ActiveRecord::StatementInvalid: SQLite3::ConstraintException: categories.name 不能为 NULL: INSERT INTO "categories" ("created_at", "updated_at", "id") VALUES ('2010-08-16 02 :06:43', '2010-08-16 02:06:43', 980190962) /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc /lib/active_record/connection_adapters/abstract_adapter.rb:202:in rescue in log' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb:194:inlog' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/ connection_adapters/sqlite_adapter.rb:135:in execute' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:239:ininsert_fixture' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:634 :在block in insert_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:570:in每个'/Users/janlimpens/.rvm/gems/ruby-1.9。2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:570:ininsert_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:increate_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:ineach' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in块中的块(4 级) (3 个级别)在 create_fixtures 的 /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:139 :在transaction' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:512:increate_fixtures'/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb中的块(2级)中: 104:indisable_referential_integrity' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:503:in块在 create_fixtures'/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/benchmarkable.rb:55 :insilence' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:502:increate_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:961:in load_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:926:insetup_fixtures' /Users/janlimpens/ .rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:409:in _run_setup_callbacks' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/testing/setup_and_teardown.rb:34:inrun'

0 投票
4 回答
120 浏览

c++ - 一个类和它的基类之间有什么可检测的差异?

给定以下模板:

Footype对象和type 对象之间在接口或行为上有哪些明显的差异wrapper<Foo>

我已经知道一个:

  • wrapper<Foo>仅具有空值构造函数、复制构造函数和赋值运算符(并且仅在这些操作在 上有效时才具有Foo)。wrapper<T>可以通过在其中将值传递给 T 构造函数的一组模板化构造函数来减轻这种差异。

但我不确定可能存在哪些其他可检测的差异,或者是否有隐藏它们的方法。


(编辑)具体例子

有些人似乎在询问这个问题的一些背景,所以这是对我的情况的(有些简化的)解释。

我经常编写具有可以调整的值的代码,以调整系统的精确性能和操作。我希望有一种简单(低代码开销)的方式来通过配置文件或用户界面公开这些值。我目前正在编写一个库来允许我这样做。预期的设计允许使用如下:

运行时,这将设置或读取以下配置值:

这是由代码组成的(碰巧我的用例甚至不是机器学习),但它显示了设计的几个重要方面。可调整的值都是命名的,并且可以组织成层次结构。值可以通过几种方法进行分组,但在上面的示例中,我只展示了一种方法:将对象包装在hotobject<T>类中。在实践中,hotobject<T>包装器有一个相当简单的工作——它必须将对象/组名称推送到线程本地上下文堆栈中,然后允许T构造对象(此时hotvar<T>构造值并检查上下文堆栈以看看他们应该在哪个组),然后弹出上下文堆栈。

这是按如下方式完成的:

据我所知,这种情况下的构造顺序非常明确:

  1. hotobject_stack_helper被构造(将名称推入上下文堆栈)
  2. T被构造——包括构造每个T成员(热变量)
  3. hotobject<T>构造函数的主体运行,它弹出上下文堆栈。

所以,我有工作代码来做到这一点。然而,还有一个问题,那就是:通过使用这种结构,我可能会给自己带来什么问题。这个问题很大程度上归结为我实际要问的问题:hotobject 的行为与 T 本身有何不同?

0 投票
1 回答
451 浏览

python - 如何将“mixin”类应用于旧式基类

我写了一个混合类,它被设计成分层在一个新式类之上,例如通过

将此 mixin 应用于旧式类的最流畅的方法是什么?它super在其__init__方法中使用了对的调用,因此这可能(?)必须更改,但否则我想对MixinClass. 我应该能够派生一个进行必要更改的子类。

我正在考虑在派生自的类之上使用类装饰器BaseClass,例如

whereMixinOldSchoolRemix派生自MixinClass并且只是重新实现super用于代替使用包含与其混合的类的类变量的方法,在这种情况下OldStyleClass。此类变量将old_style_mix作为混合过程的一部分设置。

old_style_mix只会MixedWithOldStyleClass用 mixin 类 (eg MixinOldSchoolRemix) 字典的内容更新 eg 的类字典。

这是一个合理的策略吗?有没有更好的办法?鉴于仍有许多可用模块仍在使用旧式类,这似乎是一个常见问题。

0 投票
3 回答
158 浏览

c# - 从实现者调用接口扩展方法在 C# 中很奇怪

从实现者调用适用于接口的扩展方法似乎需要使用 this 关键字。这似乎很奇怪。

有谁知道为什么?

有没有更简单的方法来获得接口的共享实现?

这让我很恼火,因为我正在遭受多重继承/混合退出。

玩具示例:

0 投票
4 回答
22021 浏览

ruby-on-rails - 如何从 Rails 中的控制器混入和调用 link_to?

这似乎是一个菜鸟问题,但简单的答案让我望而却步。我需要调用link_to一个ActionController方法来吐出一个 HTML 链接。 ActionView::Helpers::UrlHelper.link_to调用url_for,但这会调用 AV 模块的版本而不是控制器的版本。我设法通过放

在控制器中。但是,我仍然不确定为什么它完全有效。有人可以解释这里发生的方法范围和隐藏吗?有什么更好的混合方式link_to(或者通常只包含来自模块的一些方法),这样我就可以在控制器中调用它(用链接生成闪存字符串是用例。)

拜托,没有关于 MVC 的讲座——如果有的话,link_to应该在与url_for. 从这方面的噪音来看,很多人遇到了这个看似微不足道的障碍,最终浪费了一个小时以“Rails 方式”进行,而真正想要的是让我的应用程序现在运行的一分钟破解。也许有一种“Rails 方式”可以用助手来做到这一点?还是更好的红宝石方式?

0 投票
2 回答
1468 浏览

ruby - 为什么 Ruby 模块包含排除模块的单例类?

当类在 Ruby 中被继承时,单例类也被继承:

然而对于模块,情况并非如此:

为了解决这个限制,许多人求助于这个丑陋的黑客:

好的,所以我的问题是:这种对模块的限制背后是否有理论/概念上的原因?还是只是实施困难?

查看 C 源代码 (YARV/MRI) 后,我可以确定存在一个实现困难(不是无法克服,但都是一样的),但这是唯一的原因吗?这种限制还有其他原因吗?

谢谢