Как я могу заставить разработчика Windows Forms Visual Studio 2008 года представлять Форму, которая реализует абстрактный базовый класс?

Для упрощения себя во встроенное программирование можно хотеть попытаться использовать XNA или для Xbox или для Zune. Вы не будете делать управления памятью, но Вы привыкнете к ограниченным аппаратным средствам, если Вы сделаете это на Zune. По общему признанию это использует C#; но Вы могли всегда делать программирование себя с помощью CIL.

98
задан Peter Mortensen 23 August 2011 в 21:35
поделиться

3 ответа

Я ЗНАЛ, что должен быть способ сделать это (и я нашел способ сделать это чисто). Решение Sheng - это именно то, что я придумал в качестве временного обходного пути, но после того, как друг указал, что класс Form в конечном итоге унаследован от класса abstract , мы ДОЛЖНЫ иметь возможность это сделать . Если они могут это сделать, мы сможем это сделать.

Мы перешли от этого кода к задаче

Form1 : Form

Проблема

public class Form1 : BaseForm
...
public abstract class BaseForm : Form

Здесь в игру вступил первоначальный вопрос. Как было сказано ранее, друг указал, что System.Windows.Forms.Form реализует базовый класс, который является абстрактным. Нам удалось найти ...

Доказательство лучшего решения

Исходя из этого, мы знали, что разработчик мог показать класс, реализующий базовый абстрактный класс, но он просто не мог показать класс дизайнера, который немедленно реализовал базовый абстрактный класс. Между ними должно быть не более 5 промежуточных элементов, но мы протестировали 1 уровень абстракции и изначально пришли к этому решению.

Первоначальное решение

public class Form1 : MiddleClass
...
public class MiddleClass : BaseForm
... 
public abstract class BaseForm : Form
... 

Это действительно работает, и дизайнер все исправляет, проблема решена ....за исключением того, что у вас есть дополнительный уровень наследования в вашем производственном приложении, который был необходим только из-за неадекватности в конструкторе winforms!

Это не стопроцентное решение, но довольно хорошее. Обычно вы используете #if DEBUG , чтобы придумать усовершенствованное решение.

Уточненное решение

Form1.cs

#if DEBUG
public class Form1 : MiddleClass
#else 
public class Form1 : BaseForm
#endif
...

MiddleClass.cs

public class MiddleClass : BaseForm
... 

BaseForm.cs

public abstract class BaseForm : Form
... 

При этом используется только решение, указанное в «начальном решении», если оно находится в режиме отладки. Идея состоит в том, что вы никогда не будете выпускать производственный режим через отладочную сборку и что вы всегда будете проектировать в режиме отладки.

Дизайнер всегда будет работать с кодом, созданным в текущем режиме, поэтому вы не можете использовать конструктор в режиме выпуска. Однако, если вы проектируете в режиме отладки и выпускаете код, построенный в режиме выпуска, все в порядке.

Единственное верное решение - проверить режим разработки с помощью директивы препроцессора.

97
ответ дан 24 November 2019 в 05:14
поделиться

Конструктор Windows Forms создает экземпляр базового класса вашей формы / элемента управления и применяет результат синтаксического анализа InitializeComponent . Вот почему вы можете создать форму, созданную мастером проекта, даже не создавая проект. Из-за этого поведения вы также не можете создать элемент управления, производный от абстрактного класса.

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

1
ответ дан 24 November 2019 в 05:14
поделиться

@Smelch, спасибо за полезный ответ, так как недавно я столкнулся с той же проблемой.

Ниже приводится небольшое изменение в вашем сообщении для предотвращения предупреждений о компиляции (путем помещения базового класса в директиву препроцессора #if DEBUG ):

public class Form1
#if DEBUG  
 : MiddleClass 
#else  
 : BaseForm 
#endif 
10
ответ дан 24 November 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: