首先,如果它只是一个writer
,它不应该知道如何阅读。当你在屏幕上实现一个作家时会发生什么?尽管如此,
ReaderWriter
除了Reader
and之外,还有一个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_cast
aWriter*
或 a
ReaderWriter*
,如果 dynamic_cast 成功,它也可以写。
编辑:我忘了提:这种技术被称为 mixins。