2014-02-18 81 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 
    } 
}