![](/img/trans.png)
[英]How do I pass a value throughout my project and use it anywhere in the program
[英]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.