繁体   English   中英

C#“通用”类型问题

[英]C# 'generic' type problem

C#问题(.net 3.5)。 我有一个ImageData类,它具有一个ushort [,]像素字段。 我正在处理专有图像格式。 ImageData类在构造函数中获取文件位置,然后打开文件扩展名以确定如何解码。 在多个图像文件中,标头中有一个“位深度”字段。 解码标头后,我将像素值读入“像素”数组。 到目前为止,我没有超过16bpp,所以我还可以。 但是,如果我有32bpp怎么办?

我想做的是在运行时确定像素的类型。 我想在读取标题中的位深之后以及将像素数据复制到内存之前执行此操作。 有任何想法吗?

我会说不要在构造函数中进行此工作-我认为构造函数不应做太多工作。 使用读取文件的工厂方法确定位深度,然后让其构造该类的正确泛型变体并返回它。

为了解决问题,您希望有一个类有时具有ushort [,]像素字段(每像素16位)和其他时候具有uint32 [,]像素字段(每像素32位) 。 有两种不同的方法可以实现此目的。

您可以通过用32位和16位子类创建Pixel类来替代ushort / uint32,从而覆盖wazoo中的各种运算符,但这会产生大量开销,难以正确确定,甚至难以确定如果它是正确的。 或者,您可以为像素数据创建代理类(它将包含ushort [,]或uint32 [,]数组,并具有所有必要的访问器才能使用)。 不利的一面是,您可能会在ImageData类中获得很多特殊情况的代码,这些代码将根据某种16位/ 32位模式标志以一种或另一种方式执行。

我认为,更好的解决方案是将ImageData分为16位和32位类,并使用工厂方法创建实例。 例如,ImageData是基类,ImageData16bpp和ImageData32bpp是子类,静态方法ImageData.Create(string imageFilename)是工厂方法,该方法根据头数据创建ImageData16bpp或ImageData32bpp。 例如:

public static ImageData Create(string imageFilename)
{
   // ...
   ImageDataHeader imageHeader = ParseHeader(imageFilename);
   ImageData newImageData;
   if (imageHeader.bpp == 32)
   {
      newImageData = new ImageData32(imageFilename, imageHeader);
   }
   else
   {
      newImageData = new ImageData16(imageFilename, imageHeader);
   }
   // ...
   return newImageData;
}

让您的解码函数返回Array类型的对象,该对象是所有数组的基类。 然后,关心该类型的人可以执行“ if(a is ushort [,])”,以此类推,如果他们想遍历像素。 如果这样做,则需要在ImageData中分配数组,而不是相反。

另外,调用者可能知道他们希望您使用哪种像素阵列。 即使是8bpp或16bpp图像,如果要将其解码为32bpp屏幕,也需要使用uint而不是ushort。 因此,您可以编写一个ImageData函数,该函数将解码为T类型的整数。

问题的根源在于您不知道如何决定所需的输出格式。 您需要首先弄清楚这一点,然后是程序语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM