Ste*_*son 56 c# extension-methods mixins
我听说有可能使用扩展方法,但我自己也无法弄明白.如果可能的话,我想看一个具体的例子.
谢谢!
Jon*_*eet 93
这实际上取决于你对"mixin"的意思 - 每个人似乎都有一个略微不同的想法.我想那种混入的喜欢看(但不可用在C#中)正在实施,通过构图简单:
public class Mixin : ISomeInterface
{
private SomeImplementation impl implements ISomeInterface;
public void OneMethod()
{
// Specialise just this method
}
}
Run Code Online (Sandbox Code Playgroud)
编译器只是通过将每个成员代理为"impl"来实现ISomeInterface,除非在类中直接有另一个实现.
虽然这一切都不可能:)
Ste*_*app 10
有一个开源框架,使您能够通过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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在同一个源文件/命名空间中有两个定义.这样,在使用界面时,扩展名始终可用(使用'using').
这为CMS 提供了有限的mixin,如CMS的第一个链接所述.
限制:
在许多情况下,它仍然足够.
如果他们(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);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然乔恩提出的编译器技巧会更好.
归档时间: |
|
查看次数: |
27966 次 |
最近记录: |