如何从其父类动态转换子类?

时间:2014-10-10 07:59:03

标签: c# winforms

这是我想要做的。我有一个名为 ParentForm 的类,其基本上是一个 Form 类,其中添加了2个内容。

然后每一个表单我让我继承 ParentForm ,所以我喜欢

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

现在假设我在 f1 中有一个按钮, f2 都打开 f3 表单并且 f3 表单构造函数如下所示:

public f3(ParentForm parent)

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

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

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");

但是当然这不起作用,任何人都有解决方案吗?

4 个答案:

答案 0 :(得分:1)

有两种选择:

  1. ParentForm包含列表的定义:

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

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

答案 1 :(得分:1)

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

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)

答案 2 :(得分:1)

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

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){
 ...
}
}

等等

答案 3 :(得分:0)

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

 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