根据开始时的值在整个程序中使用某些对象

时间:2011-02-26 17:09:39

标签: java oop

我正在编写一个程序,在程序开始时我会获取图像的位深度。一旦我有位深度,保证总是8位,16位或32位之一。一旦我有了位深度,我会对图像进行一些处理,并根据输出创建一些新图像。为了创建图像,我需要使用特定的类,IE FloatProcessor ShortProcessor ByteProcess及其相应的数组,float [] short []和byte []。

我想要做的不是在每个地方都有一个开关或一堆if,我需要确定使用哪一个。这三个类都是类的扩展,但即使我在一个方法中执行它,我仍然必须返回基类,我仍然不知道将它转换为使用它的类型。

编辑:我真正想要的是if(深度== 8)#define类型ByteProcessor等16和32

2 个答案:

答案 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;
        }
    }
}

这显然是一个人为的,非常不正确的例子,但它应该给你一般的想法。

这将引入一些代码冗余,但我认为不同类型之间的计算差异不足以保证更复杂的解决方案。