2

I do have two classes: a reader and a writer. For both classes I have an abstract interface since the data source/target should be flexible:

class abstract_reader {
...
};

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

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

The writer shall have both functionalities, to read and to write The implementation of the reading part of the concrete_writer is the same as the implementation of the concrete_reader. What would be a good way to combine these classes?

4

4 回答 4

2

您想要的有点令人困惑,但是有多种方法:

  • 从两个抽象类派生作者
  • 在 writer 中持有指向具体 reader 的指针
  • 在 writer 中保存具体 reader 的实例
  • 从 writer 中删除读取功能,并创建一个可以读写的第三类。

就个人而言,我会遵循最后一种方式,那么你将拥有一整套只读、只写和两者兼有的课程。

于 2012-08-14T13:53:34.053 回答
1

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

我这样做的方法是首先将 定义ReaderWriter为继承自Reader和的接口Writer

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*can write 的客户端代码;接收 a 的客户端代码 ReaderWriter也可以。当然,如果客户端有 a Reader*,它总是可以尝试到dynamic_castaWriter*或 a ReaderWriter*,如果 dynamic_cast 成功,它也可以写。

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

于 2012-08-14T14:22:48.897 回答
1

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

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

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

于 2012-08-14T13:51:25.407 回答
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”的类也可以读取似乎很奇怪。

于 2012-08-14T13:54:15.707 回答