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