#c# #winforms #class #oop #methods
Вопрос:
У меня есть класс с методом NewForm
ниже:
class cFormInteraction
{
public static void NewForm(Form fm)
{
if (fm is null)
{
fm = new Form();
fm.Show();
}
}
}
В formMain
, я хочу создать форму, которую я хочу, с таким кодом, как:
public static FormWantToShow FW;
private void button1_Click(object sender, EventArgs e)
{
cFormInteraction.NewForm(FW);
}
Я хочу решить эту проблему:
if (fm is null)
{
fm = new Form(); // -> How i make the program understand and new the form i transmisson in.
fm.Show();
}
Ответ №1:
Предполагая, что каждая форма, которую вы хотите показать, имеет конструктор без параметров, вы можете сделать это с помощью универсального метода с ref
параметром.
Общий аспект позволяет NewForm
методу знать, какой тип формы создавать, а ref
параметр позволяет вызывающему коду сохранять ссылку на вновь созданную форму, которая будет сохранена в поле.
static class FormInteraction
{
public static void NewForm<T>(ref T fm)
where T : Form, new()
{
if (fm is null)
{
fm = new T();
fm.Show();
}
}
}
Затем в вызывающем коде:
public static FormWantToShow form;
private void button1_Click(object sender, EventArgs e)
{
FormInteraction.NewForm(ref form);
}
(Я изменил имена, чтобы следовать обычным соглашениям об именах на C#.)
Ответ №2:
Мне кажется, что это немного запутывает null
проверку NewForm
метода.
Также кажется странным, что название этого метода-это NewForm
когда он может на самом деле не создавать форму.
Также странно, что он также показывает форму, не имея этого в названии.
Тогда мне кажется, что код должен быть таким:
static class FormInteraction
{
public static T NewAndShowForm<T>()
where T : Form, new()
{
var fm = new T();
fm.Show();
return fm;
}
}
Тогда вы бы назвали это так:
public static FormWantToShow form;
private void button1_Click(object sender, EventArgs e)
{
if (form != null)
{
form = FormInteraction.NewAndShowForm<FormWantToShow>();
}
}