Чтение и запись с файлами с помощью WinAPI в C++

Чтение и запись с файлами с помощью WinAPI в C++
Чтение и запись с файлами с помощью WinAPI в C++ - priscilladupreez @ Unsplash

Если я определяю ReadFile и WriteFile, которые наследуются от File, как мне определить ReadWriteFile?

Точно так же: как прямое производное от File.

И, вероятно, ваш следующий вопрос будет о том, как избежать дублирования кода. Этого можно достичь, переместив весь общий код в File как защищенные методы, и пусть ReadFile, WriteFile и ReadWriteFile содержат только методы, которые им делегируются, например

// public
void WriteFile::write_to_file()
{
    // defined in base class File
    write_to_file_internal();
}

Теперь вы можете задаться вопросом, а как же ReadWriteFile::write_to_file - да, метод будет выглядеть точно так же, как WriteFile::write_to_file - но это только делегированный код, никакой дублированной логики, а принцип DRY заключается в том, чтобы не дублировать никакую логику.

Все остальные методы (а также конструктор, который также должен быть защищен для File) работают так же: примите небольшое количество бойлерплейта, но общая логика будет существовать только один раз, в File.

До этого момента не существует ни MI, ни виртуального наследования. Однако вы можете захотеть, чтобы экземпляры ReadWriteFile можно было использовать в местах, где некоторый код делает что-то с экземплярами WriteFile или ReadFile. Тогда каноническим решением будет введение двух общих интерфейсных классов с чисто виртуальными методами. Таким образом, ReadWriteFile и ReadFile будут наследоваться от IReadFile и File, ReadWriteFile и WriteFile будут наследоваться от IWriteFile и File.

Так что да, это расширенное решение требует MI, но только с одним наследованием реализации (от File), а все остальные производные используют наследование интерфейса. Это обычный способ, как MI может быть использован в основном беспроблемным образом.

Рекомендую посмотреть эти видео для лучшего погружения в вопрос:

Прикрепленное видео 1 - Разработка приложений с помощью WinAPI. Урок 3 чтение и запись в файл

Прикрепленное видео 2 - C++ чтение и запись файлов


LetsCodeIt, 19 января 2023 г., 04:04