C#"通用"类型问题
Cquestion(.net 3.5)。我有一个ImageData类,它具有一个ushort [,]像素字段。我正在处理专有图像格式。 ImageData类在构造函数中获取文件位置,然后打开文件扩展名以确定如何解码。在几个图像文件中,标头中有一个"位深度"字段。解码标头后,我将像素值读入"像素"数组。到目前为止,我没有超过16bpp,所以我还可以。但是,如果我有32bpp怎么办?
我想做的是在运行时确定像素的类型。我想在读取标题中的位深之后,然后再将像素数据复制到内存中,然后再执行此操作。有任何想法吗?
解决方案
我会说不要在构造函数中执行此工作。我认为,构造函数不应执行过多的工作。使用读取文件的工厂方法确定位深度,然后让其构造该类的正确泛型变体并返回它。
让解码函数返回Array类型的对象,该对象是所有数组的基类。然后,关心类型的人可以执行" if(a is ushort [,])",以此类推,如果他们想遍历像素。如果这样做,则需要在ImageData中分配数组,而不是相反。
另外,调用者可能知道他们希望我们使用哪种像素阵列。即使是8bpp或者16bpp图像,如果要将其解码为32bpp屏幕,也需要使用uint而不是ushort。因此,我们可以编写一个ImageData函数,该函数将解码为T类型的整数。
问题的根源在于我们不知道如何决定所需的输出格式。我们需要首先弄清楚这一点,然后是程序语法。
为了解决问题,我们希望有一个类有时具有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; }