首先,如果它只是一個writer
,它不應該知道如何閱讀。當你在屏幕上實現一個編寫器時會發生什麼 ?儘管如此,除了Reader
和Writer
之外,還有一個 ReaderWriter
,這是一個非常合理的選擇,並且會產生相同的問題。
我會做到這一點的辦法,首先,定義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
它到Writer*
或 ReaderWriter*
,如果dynamic_cast成功,它也可以寫入。
編輯:我忘了提及:這種技術被稱爲mixins。
我很困惑:你有一個讀者和一個作家,但作者也是一個讀者(那麼爲什麼有一個單獨的讀者?),但實際上兩者都以相同的方式實現? – 2012-08-14 13:51:41
在大多數情況下,我只需要一個閱讀器,所以有一個閱讀器類是有意義的。寫作只在特殊情況下需要。 m_data與用戶隱藏,但在兩種情況下都是相同的格式。作者在大多數情況下依賴於已經在數據源中的數據。如果我有一個單獨的閱讀器和書寫器,我需要將m_data(這只是一個實現工具)從閱讀器傳遞給作者。流程如下:我讀取數據,將一些數據提供給用戶,用戶創建新數據,用戶將新數據提供給寫入器,寫入器更新數據源。 – Michael 2012-08-14 18:55:06