首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是糟糕设计的一个例子吗?

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

Stack Overflow用户
提问于 2014-04-16 02:03:11
回答 1查看 131关注 0票数 2

我将从我的设计开始:

代码语言:javascript
复制
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接口)。但是在​​返回的评价方法中,我不得不执行一个类型转换。

这个实现是正确的吗?或者这是糟糕设计的一个例子?

你能建议另一种设计吗?或者设计模式来帮助你。

代码语言:javascript
复制
IInputBlock * MultiplicationNode::evaluate()
{
    IOutputBlock *outputBlock = new IOBlock();
    //need to write to outputblock
    return (IInputBlock *)outputBlock;
}

我也可以在下面这样做,但我认为这是不对的,因为我违反了“程序到接口”,并且在IInputBlock接口的评估方法中暴露了不必要的方法。

代码语言:javascript
复制
IInputBlock * MultiplicationNode::evaluate()
{
    IOBlock *outputBlock = new IOBlock();
    //need to write to outputblock
    return outputBlock;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 02:14:46

一种选择是分离读类和写类(即使基础数据是共享的):

代码语言:javascript
复制
class WriteOnlyBlock: public IOutputBlock{
    // return new instance of something like ReadOnlyBlock 
    // potentially tied to same internal data
    public: IInputBlock AsRead()...
}

通过这种方式,可以使转换显式化,并防止调用方试图将IInputBlock转换为IOutputBlock,并尽量减少每个类公开的额外方法的数量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23097722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档