问题标签 [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.
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),但他们大多只是陈述问题并得出结论,没有太多解释和/或解决方案(如果存在)。
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 无关/不那么严重)。
你有更多这样的提示吗?
castle-dynamicproxy - 如何将接口聚合到城堡动态代理中
我想在我的代码库中允许声明式 mixin 管理。我想声明一个接口
所以我的类只能消耗他们需要的数据访问层的位。在我的 IoC 容器中,我想将这些接口的实现聚合到一个实例中。但是,当我执行与引用线程类似的操作时,生成器会抛出一个异常,指出接口在多个地方实现。除了实现自己的拦截器并通过之外,我还能做什么?
相关主题:
更好的例子(代码墙)
投掷
c++ - 在 C++ 中创建一个 SingletonMixin 类
我有四个班级,我们称之为 S1、S2、S3 和 S4。这些类是单例;每个都有一个 getInstance 和一个 finalize 方法 - 以及一个实例私有变量。
现在,为了避免重复 finalize 和 getInstance 方法,我正在尝试创建一个 SingletonMixin 类,例如:
这里的问题是:如何实例化单例类并保持其构造函数私有?
编辑
(澄清)
我的意思是,我该怎么做:
但使用私有 T 构造 T()
谢谢!
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:in
log' /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:in
insert_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:in
create_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:in
create_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:in
create_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:in
setup_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:in
run'
c++ - 一个类和它的基类之间有什么可检测的差异?
给定以下模板:
Foo
type对象和type 对象之间在接口或行为上有哪些明显的差异wrapper<Foo>
?
我已经知道一个:
wrapper<Foo>
仅具有空值构造函数、复制构造函数和赋值运算符(并且仅在这些操作在 上有效时才具有Foo
)。wrapper<T>
可以通过在其中将值传递给 T 构造函数的一组模板化构造函数来减轻这种差异。
但我不确定可能存在哪些其他可检测的差异,或者是否有隐藏它们的方法。
(编辑)具体例子
有些人似乎在询问这个问题的一些背景,所以这是对我的情况的(有些简化的)解释。
我经常编写具有可以调整的值的代码,以调整系统的精确性能和操作。我希望有一种简单(低代码开销)的方式来通过配置文件或用户界面公开这些值。我目前正在编写一个库来允许我这样做。预期的设计允许使用如下:
运行时,这将设置或读取以下配置值:
这是由代码组成的(碰巧我的用例甚至不是机器学习),但它显示了设计的几个重要方面。可调整的值都是命名的,并且可以组织成层次结构。值可以通过几种方法进行分组,但在上面的示例中,我只展示了一种方法:将对象包装在hotobject<T>
类中。在实践中,hotobject<T>
包装器有一个相当简单的工作——它必须将对象/组名称推送到线程本地上下文堆栈中,然后允许T
构造对象(此时hotvar<T>
构造值并检查上下文堆栈以看看他们应该在哪个组),然后弹出上下文堆栈。
这是按如下方式完成的:
据我所知,这种情况下的构造顺序非常明确:
hotobject_stack_helper
被构造(将名称推入上下文堆栈)T
被构造——包括构造每个T
成员(热变量)hotobject<T>
构造函数的主体运行,它弹出上下文堆栈。
所以,我有工作代码来做到这一点。然而,还有一个问题,那就是:通过使用这种结构,我可能会给自己带来什么问题。这个问题很大程度上归结为我实际要问的问题:hotobject 的行为与 T 本身有何不同?
python - 如何将“mixin”类应用于旧式基类
我写了一个混合类,它被设计成分层在一个新式类之上,例如通过
将此 mixin 应用于旧式类的最流畅的方法是什么?它super
在其__init__
方法中使用了对的调用,因此这可能(?)必须更改,但否则我想对MixinClass
. 我应该能够派生一个进行必要更改的子类。
我正在考虑在派生自的类之上使用类装饰器BaseClass
,例如
whereMixinOldSchoolRemix
派生自MixinClass
并且只是重新实现super
用于代替使用包含与其混合的类的类变量的方法,在这种情况下OldStyleClass
。此类变量将old_style_mix
作为混合过程的一部分设置。
old_style_mix
只会MixedWithOldStyleClass
用 mixin 类 (eg MixinOldSchoolRemix
) 字典的内容更新 eg 的类字典。
这是一个合理的策略吗?有没有更好的办法?鉴于仍有许多可用模块仍在使用旧式类,这似乎是一个常见问题。
c# - 从实现者调用接口扩展方法在 C# 中很奇怪
从实现者调用适用于接口的扩展方法似乎需要使用 this 关键字。这似乎很奇怪。
有谁知道为什么?
有没有更简单的方法来获得接口的共享实现?
这让我很恼火,因为我正在遭受多重继承/混合退出。
玩具示例:
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 方式”可以用助手来做到这一点?还是更好的红宝石方式?
ruby - 为什么 Ruby 模块包含排除模块的单例类?
当类在 Ruby 中被继承时,单例类也被继承:
然而对于模块,情况并非如此:
为了解决这个限制,许多人求助于这个丑陋的黑客:
好的,所以我的问题是:这种对模块的限制背后是否有理论/概念上的原因?还是只是实施困难?
查看 C 源代码 (YARV/MRI) 后,我可以确定存在一个实现困难(不是无法克服,但都是一样的),但这是唯一的原因吗?这种限制还有其他原因吗?
谢谢