我正在编写一个程序,在程序开始时我会获取图像的位深度。一旦我有位深度,保证总是8位,16位或32位之一。一旦我有了位深度,我会对图像进行一些处理,并根据输出创建一些新图像。为了创建图像,我需要使用特定的类,IE FloatProcessor ShortProcessor ByteProcess及其相应的数组,float [] short []和byte []。
我想要做的不是在每个地方都有一个开关或一堆if,我需要确定使用哪一个。这三个类都是类的扩展,但即使我在一个方法中执行它,我仍然必须返回基类,我仍然不知道将它转换为使用它的类型。
编辑:我真正想要的是if(深度== 8)#define类型ByteProcessor等16和32
答案 0 :(得分:1)
使用泛型而不是继承怎么样?我的Java生疏了,所以我将使用C ++来演示:
template<class DataT>
class Foo
{
public:
DataT data
void processData()
{
// Do something here
};
};
如果您仍需要在processData函数中使用switch语句,您仍然可以避免将其全部放在代码上。您可以将Generics与factory method pattern结合使用,以获得您想要的效果。
答案 1 :(得分:0)
假设,假设这三个都是从基类TypeProcessor类继承的:
abstract class TypeProcessor {
public abstract Image ProcessImage(Image input);
}
并且,您有特定的课程:
class ByteProcessor extends TypeProcessor{
public byte data[];
public Image ProcessImage(Image input) {
//do stuff
return ret;
}
}
显然,如果您的程序包含TypeProcessor
引用,则无法直接访问data
(无需进行大量类型检查和转换)。
正确的解决方案是将需要访问data
的代码移入类本身:
class ByteProcessor extends TypeProcessor{
public byte data[];
public Image ProcessImage(Image input) {
//do stuff
data = whatever;
FrobData
Image ret = new Image(data);
return ret;
}
void FrobData() {
for(i = 0; i < data.length; i++) {
data[i] = (data[i] + 1) % 64;
}
}
}
这显然是一个人为的,非常不正确的例子,但它应该给你一般的想法。
这将引入一些代码冗余,但我认为不同类型之间的计算差异不足以保证更复杂的解决方案。