Явный вызов методов интерфейса из базового класса winforms - PullRequest
3 голосов
/ 08 февраля 2012

У меня есть базовая форма winforms, которая содержит вызовы определенных методов, которые должны быть реализованы в производных формах.Я хочу убедиться, что мои производные формы действительно реализуют эти методы с максимально возможной поддержкой времени компиляции.Всем нам известна проблема невозможности определить класс winforms как абстрактный, если вы хотите использовать конструктор (см. этот вопрос ).

Я создал интерфейс, который содержит сигнатуры методов, которые должны быть реализованы в производной форме.Затем я вызываю методы интерфейса непосредственно из базового класса, например, так:

((IMyFormInterface)this).SomeInterfaceMethod();

(Обратите внимание, что мой базовый класс не наследует IMyFormInterface. Если это так, то производные классы не будут вынуждены реализовыватьэто.)

А потом я наследую от интерфейса в своей производной форме (которую компилятор заставляет меня реализовать):

public partial class TestForm : BaseForm, IMyFormInterface

Единственное, что мне (или другим пользователям) приходитсяпомните, это наследовать IMyFormInterface.

Допустимо ли вызывать методы интерфейса напрямую, как это?Моя цель во всем этом заключается в том, чтобы максимально приблизиться к тому, чтобы производные формы реализовывали эти «абстрактные» методы форм во время компиляции, а не во время выполнения.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Это один из способов обойти ограничение дизайнера. Другой вариант - использовать конструктор для создания UserControl, а затем позволить базовому классу формы быть абстрактным и создать экземпляр элемента управления, закрепленного за всей клиентской областью.

Если вы воспользуетесь этим подходом, я бы утверждал (this is IMyFormInterface) в вашем конструкторе, чтобы перехватить эту ошибку как можно раньше.

0 голосов
/ 08 февраля 2012

У меня была такая же проблема с базовым элементом управления.
Поскольку Designer не нравится классы абстрактного базового элемента управления, я реорганизовал абстрактные методы в виртуальные методы, которые генерируют исключение NotImplementedException.
Я не знаю, какой путьЛучший.

...