Требовать потомка абстрактного класса в аргументах метода - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть метод, который берет объект SubForm и отображает его.

public void subFormLauncher(object sender, SubForm f)
{
    if (f == null)
    {
        f = new SubForm(this);    // This line is problematic
        f.Show();
    }
    else
    {
        if (!f.Visible)
        {
            f.Show();
        }
        f.Activate();
    }
}

VS злится, потому что SubForm - абстрактный класс, и я случайно создал его экземпляр (справедливо).

public abstract class SubForm : Form
{
    public SubForm(frmMain f) { }
    public abstract void InitForm();
}

Есть ли способ указать в аргументах subFormLauncher, что я хочу дочерний элемент SubForm? Что-то вроде:

public void subFormLauncher(object sender, <T> extends SubForm f)

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018
public void subFormLauncher(object sender, SubForm f)

Уже объявляет, что передаваемый объект должен иметь тип "SubForm", проблема в том, что ваша логика пытается создать здесь подчиненную форму:

f = new SubForm(this);    // This line is problematic

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

0 голосов
/ 26 апреля 2018

Что-то со всей вашей аппрохой кажется "выключенным":

public void subFormLauncher(object sender, SubForm f) напоминает мне о событии (отправитель объекта), но это не выглядит так, как должно происходить событие.

Также довольно странно, что вы передаете Форму как параметр, тем более что вы над ней работаете. Вы помещаете это в передний план, если вы даете это, но если не вы создаете это экземпляр?

Существует довольно высокая вероятность того, что вы глубоко в проблеме XY здесь.

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

public void subFormLauncher<T>(object sender, T f) where T : SubForm 
{
    if (f == null)
    {
        f = new T(this);    // This line is problematic
        f.Show();
    }
    else
    {
        if (!f.Visible)
        {
            f.Show();
        }
        f.Activate();
    }
}
0 голосов
/ 26 апреля 2018

Вы можете использовать интерфейс и запросить это в вызове вашего метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...