C ++ разделил абстрактные классы (интерфейс) для какого-то общего доступа для чтения и / или записи или нет?

0

Если для этого нужен какой-то общий доступ для чтения и/или записи, лучше сделать это следующим образом?:

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) { ... }
};

Или можно сделать что-то еще?

  • 1
    Не забудьте определить виртуальный деструктор для базовых классов (IRead, IWrite)
Теги:
interface
abstract-class
pure-virtual

3 ответа

2
Лучший ответ

Первый путь лучше, из-за принципа замены Лискова. Базовый класс, который предлагает читать и писать, но на самом деле не может обещать, что либо будет работать, в основном бесполезно. Два базовых класса, которые предлагают гарантированную функциональность, гораздо полезнее.

С другой стороны, действуйте осторожно, потому что, хотя соблазнительно думать, что чтение и письмо можно абстрагироваться чисто, часто это не так. Например, чтение и запись с использованием сетевых сокетов требует дополнительного состояния для обработки асинхронной работы; чтение датаграмм из UDP имеет разную семантику, чем пакеты из TCP и т.д.

  • 0
    Спасибо, особенно за осторожность с утечками абстракций.
0

Вопрос может быть более общим, чем доступ к чтению/записи, но, поскольку это неясно, я подведу некоторые причины, по которым я бы посоветовал полностью:

  • C++ уже имеет const
  • Write-only имеет очень мало пользы (доступ к оборудованию?)
  • Вам нужны хотя бы шаблоны для этого (только чтение/запись ints?), И это может осложниться
  • Нет функционального усиления
  • Вы вынуждаете свои классы иметь виртуальные функции (и виртуальный деструктор) без использования полиморфизма.
  • Getters/seters следует использовать только при необходимости, классы должны предпочтительно просто делать что-то

Извините за негатив, это просто совет.

  • 0
    Да, код, который я показал, используется для иллюстрации общих концепций. Практическая реализация этой концепции более сложна. Я не могу описать, почему, но у меня есть ощущение, что const, неконстантные и абстрактные функции чтения и / или записи не совсем одно и то же в C ++. Может я не прав?
  • 0
    Нет, они не одинаковы. Но функциональность чтения / записи может быть использована неправильно, когда const будет более подходящим. В любом случае, никто не мешает вам реализовать его, и если так, то первый подход лучше, чем другие.
0

Вероятно, раньше я бы сказал, и причина этого; Если это конкретный класс readonly, почему компилятор должен применить к нему метод Write (...)?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню