为了简化您的问题,您希望能够拥有一个有时具有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;
}