在方法参数中需要抽象类的子级

时间:2018-04-26 20:38:35

标签: c# oop abstract-class

我有一个方法,它接受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 :(得分:3)

public void subFormLauncher(object sender, SubForm f)

已经声明传入的对象必须是&#34; SubForm&#34;类型,问题是您的逻辑是尝试在此处创建子表单:

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

但是作为它的摘要,你不能把它当作新的。如果你删除它,并且在传递给你的方法时不允许子表格为null,则问题就解决了。

答案 1 :(得分:2)

整个appraoch的某些东西似乎“关闭”:

public void subFormLauncher(object sender, SubForm f)让我想起了一个事件(对象发送者),但这看起来不像是一个事件。

您将表单作为参数传递也很奇怪,更不用说您正在做的工作了。如果你给它,你把它放到foregroind中,但如果没有你实例化它?

你很有可能在这里XY problem深处。

您无法指定要创建的确切类型。一种方法可能是在混合中添加一些通用:

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();
    }
}

答案 2 :(得分:-2)

您可以使用界面并在方法调用中请求它。