具体来说,我正在使用EmguCV's Image
type。
我已经使用方法ITransformation
定义了一个接口ApplyFrom
,该方法接受Image
并返回Image
:
public interface ITransformation
{
Image<TColor, TDepth> ApplyFrom<TColor, TDepth>(Image<TColor, TDepth> sourceImage);
}
但是这对于类型参数来说似乎非常冗长,特别是在使用该方法时。理想情况下,界面看起来像这样:
public interface ITransformation
{
Image ApplyFrom(Image sourceImage);
}
但Visual Studio抱怨Image
需要2个类型参数。我不想将ApplyFrom()
方法绑定到特定的颜色或深度
我需要使用上面的通用,详细的第一版吗?
或者我错过了两个版本之间可能存在的中间立场?
答案 0 :(得分:4)
我是否需要使用上面的通用,详细的第一版?
是 - 您需要在引用泛型类型时指定通用参数。就像您无法将List
作为类型引用一样 - 您需要完全限定通用参数(List<T>
,List<int>
等)。
当使用方法时,编译器可能能够推断出通用参数,但声明必须包含你拥有它们的所有三个位置的泛型参数。
关于减少详细程度(并保持函数通用性)的唯一方法是缩短通用参数名称:
public interface ITransformation
{
Image<C, D> ApplyFrom<C, D>(Image<C, D> sourceImage);
}
您失去了通用参数的自我记录性质,但是对于编译器没有区别。
答案 1 :(得分:1)
我不想将ApplyFrom()方法绑定到特定的颜色或深度
这正是泛型的用途。这是为了编写一种方法,在编写此方法时不需要指定那些通用的类型。
这些是你的选择;指定图像使用的确切类型,不允许它们成为任何其他类型,或使方法通用,以便调用者可以提供任何类型的图像作为通用参数。
答案 2 :(得分:1)
您可以缩短方法,但代价是使界面通用(因此更详细)。
public interface ITransformation<T, TColor, TDepth> where T : Image<TColor, TDepth> {
T ApplyFrom(T sourceImage);
}