从内部类访问外部类的字段
本文关键字:字段 外部 内部类 访问 | 更新日期: 2023-09-27 18:28:36
我有一个内部类来包含我的项目的方法;并且我想使用Form
类事件处理程序从内部类调用我的方法;但我在访问外部类的成员(如label1
、label2
、label3
等)时遇到问题。
如何访问外部类的字段?
我正试图在构造函数内部建立一个关联:
public partial class Form1 : Form
{
// declare inner class here
public MachineClass machineObj = new MachineClass();
public class MachineClass
{
int fruit1, fruit2, fruit3, fruitvalue1, fruitvalue2, fruitvalue3;
public void spinslot()
{
Random player = new Random();
fruit1 = player.Next(10);//generates a number between 0 and 9
fruit2 = player.Next(10);//generates a number between 0 and 9
fruit3 = player.Next(10);//generates a number between 0 and 9
fruitvalue1 = fruit1 + 1;//
fruitvalue2 = fruit2 + 1;//
fruitvalue3 = fruit3 + 1;//
label1.ImageIndex = fruit1;//display image in label - uses image list
label2.ImageIndex = fruit2;//display image in label - uses image list
label3.ImageIndex = fruit3;//display image in label - uses image list
}
}
}
一种方法是,让父类保持对子类的引用,反之亦然。所以对于这个类结构:
class ParentClass
{
public ParentClass()
{
this.child = new ChildClass(this);
}
public ChildClass child { get; set; }
class ChildClass
{
public ParentClass Parent { get; set; }
public ChildClass(ParentClass par)
{
this.Parent = parent;
}
}
}
那么,任何时候你想从子类访问父类中的一个字段,你都可以调用.parent.Whatever。当然,这会迫使你同时实例化这两个字段,所以我不确定这是否是实现你想要的目标的好方法,也不确定它是否能满足你的目的。
编辑:或者,您可以使用ParentClass作为ChildClass的某种工厂,比如:
class ParentClass
{
public ParentClass() { }
public class ChildClass
{
public ParentClass Parent { get; set; }
public ChildClass(ParentClass par)
{
this.Parent = par;
}
}
public ChildClass GetChild()
{
return new ChildClass(this);
}
}
并且您可以从任何给定的ParentClass实例化无限数量的相关ChildClass,并调用。任何ChildClass的Parent都将引用创建它的ParentClass。
不过,我想指出的是,根据我的经验,我发现内部类的用途很少,我想不出有哪一次以上的类设计会让我受益。特别是考虑到你的例子看起来并没有什么特别之处,似乎您最好在Form类的范围之外构建一个普通类,并根据需要将数据传递给它,而不是试图创建一个具有父子关系的复杂内部类。
以下是您真正需要做的事情,以实现这一点,并使用更好的OO设计。
首先,定义内部MachineClass
,如下所示:
public class MachineClass
{
private int fruit1, fruit2, fruit3;
public delegate void FruitUpdate(int value);
public event FruitUpdate FruitUpdate1;
public event FruitUpdate FruitUpdate2;
public event FruitUpdate FruitUpdate3;
public void spinslot()
{
Random player = new Random();
fruit1 = player.Next(10);
fruit2 = player.Next(10);
fruit3 = player.Next(10);
if (this.FruitUpdate1 != null) this.FruitUpdate1(fruit1);
if (this.FruitUpdate2 != null) this.FruitUpdate2(fruit2);
if (this.FruitUpdate3 != null) this.FruitUpdate3(fruit3);
}
}
FruitUpdate
委托允许定义三个事件,这些事件可以让此类的外部用户知道水果值何时更新。当更新fruit值时,我们会检查是否有附加到事件的处理程序,然后只调用事件。MachineClass
不需要知道有任何正在侦听的内容。
现在Form1
类看起来有点像这样:
public partial class Form1
{
public MachineClass machineObj = new MachineClass();
public void Form1_Load()
{
this.machineObj.FruitUpdate1 += v => label1.ImageIndex = v;
this.machineObj.FruitUpdate2 += v => label2.ImageIndex = v;
this.machineObj.FruitUpdate3 += v => label3.ImageIndex = v;
}
public class MachineClass
{
/* definition from above */
}
}
这里,Form1
类创建MachineClass
的实例,然后将处理程序附加到每个水果更新事件。这允许在MachineClass
根本不知道的情况下更新标签!