![]() |
1
86
这真的取决于你所说的“混音”是什么意思——每个人似乎都有一个稍微不同的想法。我喜欢的那种混音 喜欢 要查看(但在c中不可用)正在使通过组合实现变得简单:
编译器将通过将每个成员代理到“impl”来实现IsomeInterface,除非类中直接有另一个实现。 但目前这一切都不可能:) |
![]() |
2
9
有一个开放源码框架,使您能够通过c_实现mixin。看一看 http://remix.codeplex.com/ . 用这个框架实现mixin非常容易。只需看看样本和页面上给出的“附加信息”链接。 |
![]() |
3
7
我通常采用这种模式:
我在同一个源文件/命名空间中有两个定义。 这样,当使用接口(带有“using”)时,扩展总是可用的。 这给了你一个 有限混合 如CMS的第一个链接所述。 局限性:
在很多情况下还是足够的。 如果他们(ms)能添加一些编译器魔术来自动生成扩展类,那就太好了:
尽管jon提出的编译器技巧会更好。 |
![]() |
4
4
LinFu 和 Castle's DynamicProxy 实施混音。cop(composite-oriented programming)可以被认为是用mixin构建了一个完整的范例。 This post from Anders Noras 有有用的信息和链接。 编辑:这在C 2.0中是完全可能的,没有扩展方法 |
![]() |
5
3
您还可以扩展扩展方法来合并状态,模式与wpf的附加属性没有什么不同。 下面是一个最小样板的例子。请注意,不需要对目标类进行任何修改,包括添加接口,除非您需要以多态方式处理目标类—在这种情况下,您最终得到的结果非常接近实际的多重继承。
用途:
请注意,它也适用于空实例,因为扩展方法自然会这样做。 您还可以考虑使用WeakDictionary实现来避免由于集合将目标类引用作为键而导致的内存泄漏。 |
![]() |
6
2
我需要类似的东西,所以我想出了以下使用反射。发射。在下面的代码中,将动态生成一个新类型,该类型具有“mixin”类型的私有成员。对“mixin”接口方法的所有调用都转发到此私有成员。定义了一个单参数构造函数,它接受实现“mixin”接口的实例。基本上,它等于为给定的具体类型t和接口i编写以下代码:
这是班级:
这是用法:
|
![]() |
7
1
如果您有一个可以存储数据的基类,则可以强制执行编译器安全性并使用标记接口。 从公认的答案来看,这或多或少是“C 3.0中的混音”的意思。
对象库:
因此,如果您有一个可以从“objectbase”继承并用ihasstuff装饰的类,那么现在就可以添加sutff了 |
![]() |
8
0
这是我刚刚想到的一个mixin实现。我可能会用它 a library of mine . 可能是以前在什么地方做的。 都是静态输入的,没有字典什么的。每种类型都需要一点额外的代码,每个实例不需要任何存储空间。另一方面,如果您愿意的话,它还提供了动态更改mixin实现的灵活性。没有后期生成、预生成和中期生成工具。 它有一些限制,但它确实允许重写等操作。 我们首先定义一个标记接口。也许稍后会添加一些内容:
这个接口是由mixins实现的。混音是普通班。类型不直接继承或实现mixin。相反,它们只是使用接口公开mixin的一个实例:
实现这个接口意味着支持mixin。显式地实现它很重要,因为我们将为每种类型提供其中的几个。 现在来看看使用扩展方法的小技巧。我们定义:
有趣的是(尽管回顾过去,它确实有意义),intellisense没有检测到扩展方法
它会给你一个编译错误。 你可以稍微花哨一点,并定义以下方法:
这样做的目的是,a)显示一个名为
|
![]() |
9
0
我找到了一个解决办法 here ,虽然不是完全优雅,但允许您实现完全可观察的mixin行为。另外,智能感知仍然有效!
|
![]() |
jjmerelo · 混合输入角色声明中提供的混合输入对象变量 7 年前 |
![]() |
Rahul · 在运行时替换python Mixin类 7 年前 |
![]() |
Luke De Feo · 使现有类在scala中实现特征 7 年前 |
![]() |
LorenzoBerti · 两个同名函数Vuejs的混合 7 年前 |
![]() |
davidrpugh · 在mixin中访问Akka Actor上下文 7 年前 |
![]() |
Ofisora · 如何访问聚合物元素模板内js文件中定义的函数? 7 年前 |