我将从我的设计开始:
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();
};
在evaluate方法中,我需要创建一个IOuputBlock
来在块中写入数据。
我希望MultiplicationNode
使用者只看到迭代块(IInputBlock
接口)的方法。
但是在评估方法的回归中,我必须进行类型转换
这个实现是否正确?或者这是一个糟糕设计的例子?
你能提出另一种设计吗?或者也许是设计模式来帮助。
IInputBlock * MultiplicationNode::evaluate()
{
IOutputBlock *outputBlock = new IOBlock();
//need to write to outputblock
return (IInputBlock *)outputBlock;
}
我也可以在下面执行此操作,但我不认为这是正确的,因为我违反了#34;编程到界面",并在{{1}中公开评估方法中不必要的方法接口。
IInputBlock
答案 0 :(得分:2)
一个选项是分离读写类(即使共享基础数据):
class WriteOnlyBlock: public IOutputBlock{
// return new instance of something like ReadOnlyBlock
// potentially tied to same internal data
public: IInputBlock AsRead()...
}
通过这种方式,您可以明确转换并阻止调用者尝试将IInputBlock
强制转换为IOutputBlock
,并最大限度地减少每个类公开的额外方法的数量。