2014-02-18 44 views
2

我有以下问题:通用功能过载

有几个颜色接口与基本接口IColor。

public interface IColor { } 
public interface IColor3 : IColor { } 
public interface IColor4 : IColor { } 
仅适用于某些色彩类型

有些算法支持处理:

public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true) 
     where TColor : IColor4 
    { 
     //do something 
    } 

    public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true) 
     where TColor : IColor3 
    { 
     //do something 
    } 

当我尝试编译我得到具有相同参数的函数已经定义的错误。 我该如何解决这个问题?

+2

请参阅以下博文:[通用约束不是方法签名的一部分](http://blogs.msdn。 com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx) –

+0

@MarcinJuraszek,John Rasch:非常感谢 – dajuric

回答

1

为了在接口的一种方法和测试,使这项工作,你就需要两个不同(但可能类似)泛型类

public static Image4<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true) 
    where TColor : IColor4 
{ 
    //do something 
} 

public static Image3<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true) 
    where TColor : IColor3 
{ 
    //do something 
} 

也取决于你想要什么。这两个类可以继承一个共同的基础,它可以执行任何可以在类型上执行的通用功能。IColor

7

方法的重载仅基于参数和名称。这意味着您编写的复制方法不会超载。

我建议您编辑此代码:

public static Image<IColor4, byte> Bla(this Image<IColor4, byte> img, bool inPlace = true) 
{ 
    //do something 
} 

public static Image<IColor3, byte> Bla(this Image<IColor3, byte> img, bool inPlace = true) 
{ 
    //do something 
} 

或者:

public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true) 
    where TColor : IColor 
{ 
    if(TColor == typeof(SomeSpecificType)) 
    { 
     // do something specific here. 
    } 
} 
0

正如评论所说,你提供的实际上并不构成方法重载的例子中,由于方法重载基于方法签名,仅由参数组成。

您可以只使用从ICOLOR派生内

public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true) 
    where TColor : IColor 
{ 
    if (img is IColor3) 
    { 
     //do something 
    } 
    if (img is IColor4) 
    { 
     //do something 
    } 
}