сводиться вашу проблему, вы хотите быть в состоянии иметь класс, который имеет 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;
}