当前位置:  开发笔记 > 编程语言 > 正文

是否可以在C#中实现mixins?

如何解决《是否可以在C#中实现mixins?》经验,为你挑选了3个好方法。

我听说有可能使用扩展方法,但我自己也无法弄明白.如果可能的话,我想看一个具体的例子.

谢谢!



1> Jon Skeet..:

这实际上取决于你对"mixin"的意思 - 每个人似乎都有一个略微不同的想法.我想那种混入的喜欢看(但不可用在C#中)正在实施,通过构图简单:

public class Mixin : ISomeInterface
{
    private SomeImplementation impl implements ISomeInterface;

    public void OneMethod()
    {
        // Specialise just this method
    }
}

编译器只是通过将每个成员代理为"impl"来实现ISomeInterface,除非在类中直接有另一个实现.

虽然这一切都不可能:)


我觉得很烦人,C++专家发表了"首选组合继承"之类的语句,但语言(C++或C#)为"正确的事情"提供了宝贵的帮助.
Anders请将其添加到C#5 !!
@JonSkeet:我不是downvoter,但由于这个问题要求一个具体的例子,我希望downvoter感到困惑,所提供的答案是"不是很好吗?" 而不是目前实用的解决方案.
刚看到[在VS反馈rss源上打开此连接](https://connect.microsoft.com/VisualStudio/feedback/details/627979/).如果你愿意,去投票吧.
我已经开始[在C#中实现角色](http://codecrafter.blogspot.com/2011/05/nroles-experiment-with-roles-in-c.html).看一看.他们可以实现接口并将这些实现带到组成类.
@ConspicuousCompiler:如果OP对"混合"一词所理解的含义具有特定含义,那么就更容易给出一个如何实现它的具体例子.我们所拥有的只是"我听说它有可能",这并没有真正提供太多信息.*我*并不真正将扩展方法视为混合,但可能是OP.这是一个经典案例,即提问者在问题中付出的努力越多,他们就越有可能摆脱答案.

2> Stefan Papp..:

有一个开源框架,使您能够通过C#实现mixins.请访问http://remix.codeplex.com/.

使用此框架实现mixins非常容易.只需查看示例和页面上的"附加信息"链接即可.



3> 3dGrabber..:

我通常采用这种模式:

public interface IColor
{
    byte Red   {get;}
    byte Green {get;}
    byte Blue  {get;}
}

public static class ColorExtensions
{
    public static byte Luminance(this IColor c)
    {
        return (byte)(c.Red*0.3 + c.Green*0.59+ c.Blue*0.11);
    }
}

我在同一个源文件/命名空间中有两个定义.这样,在使用界面时,扩展名始终可用(使用'using').

这为CMS 提供了有限的mixin,如CMS的第一个链接所述.

限制:

没有数据字段

没有属性(你必须用括号调用myColor.Luminance(),扩展属性是谁?)

在许多情况下,它仍然足够.

如果他们(MS)可以添加一些编译器魔法来自动生成扩展类,那将是很好的:

public interface IColor
{
    byte Red   {get;}
    byte Green {get;}
    byte Blue  {get;}

    // compiler generates anonymous extension class
    public static byte Luminance(this IColor c)     
    {
        return (byte)(c.Red*0.3 + c.Green*0.59+ c.Blue*0.11);
    }
}

虽然乔恩提出的编译器技巧会更好.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有