Для упрощения себя во встроенное программирование можно хотеть попытаться использовать XNA или для Xbox или для Zune. Вы не будете делать управления памятью, но Вы привыкнете к ограниченным аппаратным средствам, если Вы сделаете это на Zune. По общему признанию это использует C#; но Вы могли всегда делать программирование себя с помощью CIL.
Я ЗНАЛ, что должен быть способ сделать это (и я нашел способ сделать это чисто). Решение Sheng - это именно то, что я придумал в качестве временного обходного пути, но после того, как друг указал, что класс Form
в конечном итоге унаследован от класса abstract
, мы ДОЛЖНЫ иметь возможность это сделать . Если они могут это сделать, мы сможем это сделать.
Мы перешли от этого кода к задаче
Form1 : Form
public class Form1 : BaseForm
...
public abstract class BaseForm : Form
Здесь в игру вступил первоначальный вопрос. Как было сказано ранее, друг указал, что System.Windows.Forms.Form
реализует базовый класс, который является абстрактным. Нам удалось найти ...
Иерархия наследования:
public ** abstract ** class MarshalByRefObject
)
Исходя из этого, мы знали, что разработчик мог показать класс, реализующий базовый абстрактный класс, но он просто не мог показать класс дизайнера, который немедленно реализовал базовый абстрактный класс. Между ними должно быть не более 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
...
При этом используется только решение, указанное в «начальном решении», если оно находится в режиме отладки. Идея состоит в том, что вы никогда не будете выпускать производственный режим через отладочную сборку и что вы всегда будете проектировать в режиме отладки.
Дизайнер всегда будет работать с кодом, созданным в текущем режиме, поэтому вы не можете использовать конструктор в режиме выпуска. Однако, если вы проектируете в режиме отладки и выпускаете код, построенный в режиме выпуска, все в порядке.
Единственное верное решение - проверить режим разработки с помощью директивы препроцессора.
Конструктор Windows Forms создает экземпляр базового класса вашей формы / элемента управления и применяет результат синтаксического анализа InitializeComponent
. Вот почему вы можете создать форму, созданную мастером проекта, даже не создавая проект. Из-за этого поведения вы также не можете создать элемент управления, производный от абстрактного класса.
Вы можете реализовать эти абстрактные методы и генерировать исключение, когда оно не выполняется в конструкторе. Программист, производный от элемента управления, должен предоставить реализацию, которая не вызывает реализацию вашего базового класса. В противном случае программа выйдет из строя.
@Smelch, спасибо за полезный ответ, так как недавно я столкнулся с той же проблемой.
Ниже приводится небольшое изменение в вашем сообщении для предотвращения предупреждений о компиляции (путем помещения базового класса в директиву препроцессора #if DEBUG
):
public class Form1
#if DEBUG
: MiddleClass
#else
: BaseForm
#endif