类继承/组合的设计

时间:2012-08-14 13:48:56

标签: c++ inheritance abstract-class

我有两个类:读者和作家。对于这两个类,我有一个抽象接口,因为数据源/目标应该是灵活的:

class abstract_reader {
...
};

class concrete_reader : public abstract_reader {
   DATATYPE m_data;
...
};    
class abstract_writer {
...
};

class concrete_writer : public abstract_writer {
   DATATYPE m_data;
...
};

作者应具有两种功能,即读取和写入具体写入器的读取部分的实现与concrete_reader的实现相同。结合这些类的好方法是什么?

4 个答案:

答案 0 :(得分:2)

你想要的是有点混乱,但有很多方法:

  • 从两个抽象类中获取作者
  • 按住指针编写
  • 中的具体读者
  • 在作家
  • 中保留具体读者的实例
  • 从编写器中删除读取功能,并创建可以读写的第三个类。

就个人而言,我会按照最后一种方式进行操作,然后你将拥有一整套用于只读,只写和两者的课程。

答案 1 :(得分:1)

为什么作家想知道如何阅读?也许你应该考虑第三课,结合两种阅读和写作功能。

如果您确信它没问题,只需从abstract_readerabstract_writer派生出作者。只要它们是正确实现的接口(例如,没有字段),一切都应该正常工作。

哦,也许结合模板会很好(我注意到了神秘的DATATYPE

答案 2 :(得分:1)

class concrete_writer : public abstract_writer, public abstract_reader {
public:
    void read() { // or whatever the proper override is for abstract_reader
        reader.read();
    }
private:
    concrete_reader reader;
};

但是,正如@Bartek指出的那样,有一个名为“writer”的类也会读取它似乎很奇怪。

答案 3 :(得分:1)

首先,如果它只是一个writer,它应该不知道如何阅读。什么 在屏幕上实现编写器时会发生什么?还是,有一个 除了ReaderWriterReader之外,Writer是非常的 合理的选择,这会产生同样的问题。

我首先要做的是将ReaderWriter定义为 继承自ReaderWriter的接口:

class Reader
{
private:
    //  Pure virtual functions to the implementation...
public:
    virtual ~Reader() {}
    //  Interface...
};

class Writer
{
private:
    //  Pure virtual functions to the implementation...
public:
    virtual ~Writer() {}
    //  Interface...
};

class ReaderWriter : public virtual Reader, public virtual Writer
{
    //  Just joins the two; adds nothing new of its own
};

请注意虚拟继承。这通常应该是默认值 你正在扩展接口。一旦你有了,你可以(通常) 使用mixins实现:

class ConcreteReader : public virtual Reader
{
    //  Overrides for the pure virtual functions, + any data needed.
public:
    ConcreteReader();   //  Or with parameters, as needed.
};

class ConcreteWriter : public virtual Writer
{
    //  Overrides for the pure virtual functions, + any data needed.
public:
    ConcreteWriter();   //  Or with parameters, as needed.
};

class ConcreteReaderWriter : public ReaderWriter, public ConcreteReader, public ConcreteReaderWriter
{
};

收到Reader*的客户端代码可以读取;客户端代码 收到Writer*可以写;和接收的客户端代码 ReaderWriter也可以做到。当然,如果客户有一个 Reader*,它始终可以尝试dynamic_castWriter*或者{。}} ReaderWriter*,如果dynamic_cast成功,它也可以写入。

编辑:我忘了提及:这种技术被称为mixins。