まず、それが単なるの場合writer、それは読み方を知らないはずです。画面にライターを実装するとどうなりますか?それでも、と
ReaderWriterに加えて、Readerを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
};
仮想継承に注意してください。これは通常、インターフェイスを拡張するときのデフォルトです。それができたら、(通常は)実装にミックスインを使用できます。
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_castそれを試みることができ、dynamic_castが成功した場合、それは同様に書き込むことができます。Writer*ReaderWriter*
編集:私は言及するのを忘れました:このテクニックはミックスインとして知られています。