Если для этого нужен какой-то общий доступ для чтения и/или записи, лучше сделать это следующим образом?:
class IRead {
public:
virtual int read() const = 0;
};
class IWrite {
public:
virtual void write(int) = 0;
};
class concrete_readonly : public IRead {
public:
virtual int read() const { ... }
};
class concrete_writeonly : public Iwrite {
public:
virtual void write(int i) { ... }
};
class concrete_readwrite : public IRead, public IWrite {
public:
virtual int read() const { ... }
virtual void write(int i) { ... }
};
Или лучше иметь единый интерфейс и распускать нежелательные acces в производном конкретном классе, для примера? :
class IAccess {
public:
virtual int read() const = 0;
virtual void write(int) = 0;
};
class concrete_readonly : public IAccess {
public:
virtual int read() const { ... }
virtual void write(int i) { assert(0); }
};
class concrete_writeonly : public IAccess {
public:
virtual int read() const { assert(0); return 0; }
virtual void write(int i) { ... }
};
class concrete_readwrite : public IAccess {
public:
virtual int read() const { ... }
virtual void write(int i) { ... }
};
Или можно сделать что-то еще?
Первый путь лучше, из-за принципа замены Лискова. Базовый класс, который предлагает читать и писать, но на самом деле не может обещать, что либо будет работать, в основном бесполезно. Два базовых класса, которые предлагают гарантированную функциональность, гораздо полезнее.
С другой стороны, действуйте осторожно, потому что, хотя соблазнительно думать, что чтение и письмо можно абстрагироваться чисто, часто это не так. Например, чтение и запись с использованием сетевых сокетов требует дополнительного состояния для обработки асинхронной работы; чтение датаграмм из UDP имеет разную семантику, чем пакеты из TCP и т.д.
Вопрос может быть более общим, чем доступ к чтению/записи, но, поскольку это неясно, я подведу некоторые причины, по которым я бы посоветовал полностью:
Извините за негатив, это просто совет.
Вероятно, раньше я бы сказал, и причина этого; Если это конкретный класс readonly, почему компилятор должен применить к нему метод Write (...)?