如何从父类动态地转换子类

本文关键字:转换 子类 动态 父类 | 更新日期: 2023-09-27 18:26:05

这是我要做的。我有一个名为ParentForm的类,它本质上是一个Formclass,添加了两个内容。

然后其他Form我让我继承ParentForm到它,所以我喜欢

class f1: ParentForm
class f2: ParentForm
class f3: ParentForm
etc...

现在,假设我在f1f2中都有一个按钮,它们都打开f3表单,f3窗体构造函数如下所示:

public f3(ParentForm parent)

我使用它将变量传递回原始形式(在本例中为f1f2),将数据添加到那里的列表或其他任何内容。

现在我的问题来了,我现在一直在做这样的事情:

if (parent.GetType() == typeof(f1))
    {
        ((f1)parent).list.Add("a");
    }
    else if (parent.GetType() == typeof(f2))
    {
        ((f2)parent).list.Add("a");
    }

所以我为每个家长创建一个检查,我如何动态地做到这一点?类似的东西

((parent.GetType())parent).list.Add("a");

但这当然不起作用,有人能找到解决方案吗?

如何从父类动态地转换子类

我不确定这是否是最好的解决方案,但我将如何做到这一点:

abstract class ParentForm{
    ...
    public abstract void Update<T>(T updateValue)
}
public class f1 : ParentForm{
    ...
    private List<string> list;
    public override void Update(string value){
    list.Add(value);
}
}
public class f2 : ParentForm{
    ....
    private List<int> list;
public override void Update(int val){
 ...
}
}

依此类推

有两个选项:

  1. ParentForm包含列表的定义:

    public List<string> TheList { get;private set;}
    
  2. 每个表单实现相同的interfaceabstract实现:

    public abstract class ParentForm : IFormWithList
    {
        public abstract List<string> TheList { get; }
    }
    

    其中IFormWithList为:

    List<string> TheList { get; }
    

    然后您应该在每个派生类中声明它:

    public class f1 : ParentForm
    {
        public override List<string> TheList { get { return this.list; } }
    }
    

根据您的评论,您可以定义以下Interfaces:

IMyForm
{
}
IFormWithList:IMyForm
{
    ListBox ListBox { get; set; }
}
IFormWithTreeView:IMyForm
{
    TreeView TreeView { get; set; }
}

您的表单继承自相应的Interface:

 class f1: IWithListForm
 class f2: IWithListForm
 class f3: IWithListForm

现在,您可以注入IMyForm而不是ParentForm:

 public f3(IMyForm parent)

实际上,使用virual方法或属性也可以实现相同的目标。如果您将Add方法或Property声明为虚拟,则会自动调用它们各自的方法或属性。意思是如果你有:

 class Parent
    {
        public virtual void Add(string msg)
        {
            System.Windows.Forms.MessageBox.Show("Parent got msg");
        }
    }
    class child1:Parent
    {
        public override void Add(string msg)
        {
            System.Windows.Forms.MessageBox.Show("Child 1 Got Msg");
        }
    }
    class child2 : Parent
    {
        public override void Add(string msg)
        {
            System.Windows.Forms.MessageBox.Show("Child 2 Got Msg");
        }
    } 

简单地使用它们就像:

  Parent p;
  ...
  p = new child1();
  p.Add("Test"); // will call child1's add method
  p = new child2();
  p.Add("Test"); // will call child2's add method