我将从我的设计开始:
class IOutputBlock{
public:
virtual void write(char *) = 0;
virtual bool hasMemory() = 0;
virtual void openToWrite() = 0;
};
class IInputBlock{
public:
virtual bool hasNext() = 0;
virtual IField *next() = 0;
virtual void openToRead() = 0;
};
class MultiplicationNode : public OperationNode
{
public:
MultiplicationNode(Node *l, Node *r);
~MultiplicationNode(void);
virtual bool hasNext();
IInputBlock * evaluate();
};
class IOBlock: public IInputBlock, public IOutputBlock{
virtual void write(char *);
virtual bool hasMemory();
virtual void openToWrite();
virtual bool hasNext();
virtual IField *next();
virtual void openToRead();
};在评估方法中,我需要创建一个IOuputBlock来在块中写入数据。我希望MultiplicationNode使用者只需看到在块上迭代的方法(IInputBlock接口)。但是在返回的评价方法中,我不得不执行一个类型转换。
这个实现是正确的吗?或者这是糟糕设计的一个例子?
你能建议另一种设计吗?或者设计模式来帮助你。
IInputBlock * MultiplicationNode::evaluate()
{
IOutputBlock *outputBlock = new IOBlock();
//need to write to outputblock
return (IInputBlock *)outputBlock;
}我也可以在下面这样做,但我认为这是不对的,因为我违反了“程序到接口”,并且在IInputBlock接口的评估方法中暴露了不必要的方法。
IInputBlock * MultiplicationNode::evaluate()
{
IOBlock *outputBlock = new IOBlock();
//need to write to outputblock
return outputBlock;
}发布于 2014-04-16 02:14:46
一种选择是分离读类和写类(即使基础数据是共享的):
class WriteOnlyBlock: public IOutputBlock{
// return new instance of something like ReadOnlyBlock
// potentially tied to same internal data
public: IInputBlock AsRead()...
}通过这种方式,可以使转换显式化,并防止调用方试图将IInputBlock转换为IOutputBlock,并尽量减少每个类公开的额外方法的数量。
https://stackoverflow.com/questions/23097722
复制相似问题