繁体   English   中英

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

[英]Use a certain objects throughout the program based on a value at start

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

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

编辑:我真正想要的是类似if(depth == 8)#define类型ByteProcessor等,适用于16和32

使用泛型而不是继承呢? 我的Java很生锈,因此我将使用C ++进行演示:

template<class DataT>
class Foo
{
    public:

        DataT data

        void processData()
        {
            // Do something here
        };
};

如果您仍然需要在processData函数中使用switch语句,则仍然可以避免将其全部放在代码中。 您可能可以将泛型与工厂方法模式结合使用以获取所需的内容。

假设地说,假设所有这三个都继承自基本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;
        }
    }
}

这显然是一个人为的且非常不正确的示例,但它应该可以为您提供总体思路。

这将引入一些代码冗余,但是我认为不同类型之间的计算足够不同,因此不能保证采用更复杂的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM