从内部类访问外部类的字段

时间:2014-10-31 04:05:37

标签: c# .net inner-classes

我有一个内部类来包含我的项目的方法;我想使用Form类事件处理程序从内部类调用我的方法;但我无法访问外部类的成员,例如label1label2label3等。

如何访问外部类的字段?

我试图在构造函数中建立关联:

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

        }
    }
}

2 个答案:

答案 0 :(得分:1)

一种方法,在我的头顶,做这个,将是父类继续引用孩子,反之亦然。所以对于这个类结构:

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实例化无限数量的相关ChildClasses,并且从任何ChildClass调用.Parent将引用从中创建它的ParentClass。

我想说明一点,根据我的经验,我发现内部课程的用处很少,我想不出上述课程设计会让我受益的时间。特别是考虑到你的例子似乎并没有真正做任何特别的事情,看起来你最好在Form类的范围之外构建一个普通的类,并根据需要将数据传递给它,而不是试图创建一个令人费解的内部阶级与父母/子女的关系。

答案 1 :(得分:0)

这是你真正需要做的工作,并通过更好的面向对象设计来实现这一目标。

首先,像这样定义内部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委托允许定义三个事件,这些事件可以让这个类的外部用户知道何时更新水果值。当对水果值的更新发生时,我们检查是否有事件附加了处理程序,然后只调用事件。 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完全了解标签的情况下更新标签!