这是一个糟糕设计的例子吗?

时间:2014-04-16 02:03:11

标签: c++ oop design-patterns

我将从我的设计开始:

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

1 个答案:

答案 0 :(得分:2)

一个选项是分离读写类(即使共享基础数据):

class WriteOnlyBlock: public IOutputBlock{
    // return new instance of something like ReadOnlyBlock 
    // potentially tied to same internal data
    public: IInputBlock AsRead()...
}

通过这种方式,您可以明确转换并阻止调用者尝试将IInputBlock强制转换为IOutputBlock,并最大限度地减少每个类公开的额外方法的数量。