【发布时间】:2014-02-14 13:06:03
【问题描述】:
简而言之,我想使用单个接口IProducer 创建一个对象IProduct。 IProduct 将具有不同的组件,具体取决于创建它的接口。然后IProduct 类将被IConsumer 接口使用。应该根据IProduct的派生类型使用正确的IConsumer类(我不想自己做类型检查)。
我本质上想使用策略模式(单个接口背后的不同行为),但增加了返回特定于所使用的派生接口的对象的能力。我想遵守 Open/Close 原则,并且在添加更多功能时不会更改任何这些现有类。
我想完成这样的事情(我确定某处的语法是错误的,但请耐心等待):
class IProduct {
public:
int intData;
};
class ProductA : public IProduct {
public:
float floatData;
};
class ProductB : public IProduct {
public:
bool boolData;
};
class IProducer {
public:
virtual IProduct* produce(void) = 0;
};
class ProducerA : public IProducer {
public:
IProduct* produce(void) {
return new ProductA;
}
};
class ProducerB : public IProducer {
public:
IProduct* produce(void) {
return new ProductB;
}
};
class IConsumer {
public:
virtual void consume(IProduct* prod) = 0;
};
class ConsumerA : public IConsumer {
public:
void consume(IProduct* prod) {
//I want to access the float!
}
};
class ConsumerB : public IConsumer {
public:
void consume(IProduct* prod) {
//I want to access the bool!
}
};
void main() {
IProducer* producer = ProducerFactory::create("ProducerA");
IProduct* product = producer->produce();
IConsumer* consumer = ConsumerFactory::create("ConsumerA");
consumer->consume(product); //I would like the correct consumer to be used here to deal with the ProductA class
}
如果您认为有更好的方法来解决这个问题,我会全力以赴。感谢您的帮助!
【问题讨论】:
-
如果您想将消费者限制在特定种类(或多种)的产品中,听起来您会想要使用
dyanmic_cast。 -
-
@typ1232 是的,它必须是引用或指针
-
我想我已经读过这个,它被称为“切片”。我想我读到如果你使用指针,派生类会保留它的成员,但我不确定。
-
@trianta2 是的,您必须为此使用指针(抱歉,错过了第一遍)。返回值和函数参数都应该是
IProduct*。
标签: c++ design-patterns polymorphism strategy-pattern