Чтобы свести к минимуму вашу проблему, вы хотите иметь класс, который иногда имеет поле ushort [,] пикселей (16 бит на пиксель) и uint32 [,] Поле пикселей (32 бита на пиксель) иногда. Для этого есть несколько способов.
Вы можете создать замены для ushort / uint32, создав класс Pixel с 32-битными и 16-битными подклассами, переопределяя различные операторы в 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;
}