这是我想要做的。我有一个名为 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");
但是当然这不起作用,任何人都有解决方案吗?
答案 0 :(得分:1)
有两种选择:
ParentForm
包含列表的定义:
public List<string> TheList { get;private set;}
每个表单都实现了相同的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