Classes and class hierarchies
C.122
Используйте абстрактные классы как интерфейсы, когда требуется полное разделение интерфейса и реализации
Причина
Такие, как на границе ABI (ссылка).
Пример
struct Device {
virtual ~Device() = default;
virtual void write(span<const char> outbuf) = 0;
virtual void read(span<char> inbuf) = 0;
};
class D1 : public Device {
// ... data ...
void write(span<const char> outbuf) override;
void read(span<char> inbuf) override;
};
class D2 : public Device {
// ... different data ...
void write(span<const char> outbuf) override;
void read(span<char> inbuf) override;
};
Пользователь теперь может использовать D1s и D2s взаимозаменяемо через интерфейс, предоставляемый Device. Кроме того, мы можем обновить D1 и D2 способами, которые несовместимы в двоичном формате со старыми версиями, пока весь доступ проходит через Device.
Применение
???