Я борюсь с ситуацией, когда я снова и снова сталкиваюсь с ситуацией, но я не уверен, что мой поступок неправильный или я могу поступать иначе.
Пример:
У меня есть форма Windows, в которой есть DataGridView с некоторыми закрытыми методами для проверки сетки данных и интерпретации щелчков правой кнопкой мыши по представлению данных и т. Д. Эта форма Windows по сути является «абстрактным» классом и никогда не создается непосредственно.
Затем я наследую от этого базового класса и настраиваю его различными способами (шаблон шаблона), например. определить столбцы таблицы данных и конкретные методы форматирования, которые специфичны для этих столбцов и т. д.
Когда я использую эти классы, открытые методы базового класса формируют мой интерфейс, и я могу создать экземпляр определенного типа сетки данных, который мне нужен, и манипулировать им через общий интерфейс. Прекрасный.
Проблема:
Основная проблема заключается в том, что вы не можете фактически объявить класс Windows Form абстрактным, не вызывая конструктора Visual Studio шатким, поскольку он не может создать экземпляр этих абстрактных классов.
Некоторые решения:
В данный момент я «реализую» те методы в базовом классе, которые я хочу переопределить:
throw new NotSupportedException();
так что, по крайней мере, если я забуду переопределить один из этих методов, которые формируют мой интерфейс. Это мне кажется довольно вонючим, и мне это не очень нравится.
Другое решение, с которым я играл, заключалось в том, чтобы полностью отказаться от наследования и определить интерфейс (например, IMyDataGrid) и реализовать его в каждом классе представления данных (своего рода шаблон стратегии). Проблема здесь заключается в том, что вы теряете преимущества повторного использования кода, которые дает вам наследование, что означает, что вам нужно создавать много разных форм, создавать на них решетку данных - эффективно копировать и вставлять один и тот же код в каждую. Bad.
Есть ли лучший способ добиться этого?