我听说有可能使用扩展方法,但我自己也无法弄明白.如果可能的话,我想看一个具体的例子.
谢谢!
这实际上取决于你对"mixin"的意思 - 每个人似乎都有一个略微不同的想法.我想那种混入的喜欢看(但不可用在C#中)正在实施,通过构图简单:
public class Mixin : ISomeInterface { private SomeImplementation impl implements ISomeInterface; public void OneMethod() { // Specialise just this method } }
编译器只是通过将每个成员代理为"impl"来实现ISomeInterface,除非在类中直接有另一个实现.
虽然这一切都不可能:)
有一个开源框架,使您能够通过C#实现mixins.请访问http://remix.codeplex.com/.
使用此框架实现mixins非常容易.只需查看示例和页面上的"附加信息"链接即可.
我通常采用这种模式:
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); } }
虽然乔恩提出的编译器技巧会更好.