Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从内部类访问外部类的字段_C#_.net_Inner Classes - Fatal编程技术网

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

C# 从内部类访问外部类的字段,c#,.net,inner-classes,C#,.net,Inner Classes,我有一个内部类来包含我的项目的方法;我想使用表单类事件处理程序从内部类调用我的方法;但是我在访问外部类的成员时遇到问题,例如label1,label2,label3等 如何访问外部类的字段 我试图在构造函数中建立关联: public partial class Form1 : Form { // declare inner class here public MachineClass machineObj = new MachineClass(); public cla

我有一个内部类来包含我的项目的方法;我想使用
表单
类事件处理程序从内部类调用我的方法;但是我在访问外部类的成员时遇到问题,例如
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);
     }
 }
您可以从任何给定的父类实例化无限数量的相关子类,并从任何子类调用.Parent将引用创建它的父类


不过,我想指出的是,根据我的经验,我发现内部类很少有用处,而且我想不出有哪一次上面的类设计会让我受益。特别是考虑到您的示例似乎没有什么特别之处,您最好在表单类的范围之外构造一个普通类,并根据需要向其传递数据,而不是试图创建一个具有父/子关系的复杂内部类。

这里是您真正需要做的事情,以使这项工作正常进行,并使用更好的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);
    }
}
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 */
    }

}
FruitUpdate
委托允许定义三个事件,这些事件可以让此类的外部用户知道何时更新fruit值。当水果值发生更新时,我们检查是否有附加到事件的处理程序,然后只调用事件。
MachineClass
不需要知道有任何内容正在侦听

现在
Form1
类看起来有点像这样:

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);
    }
}
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
的实例,然后将处理程序附加到每个水果更新事件。这使得标签可以在
机器类
根本不知道的情况下更新

您是否试图将
修饰符
公开为
修饰符?您遇到了设计问题。好的OO设计中的一个主要考虑因素是“单一责任”的思想——每个类应该负责做一件事,并且只负责一件事。
MachineClass
是否负责更新用户界面?不需要。因此,
MachineClass
应该在需要更改某些内容时返回到UI(
Form1
),并且
Form1
应该负责更新视图。这可以通过多种不同的方式实现——您可以使用UI调用方法并从这些方法接收结果,或者您的类可以引发UI订阅的事件。@DanielMann:这是一个好主意advice@chouaib现在编辑-一秒钟。@chouaib谢谢-很抱歉耽搁了您。@furkle-我同意这是一种复杂的方式来做这件事。。。但出于某种原因,我的教授要求我们这样做。我和一年级的学生一起学习的很好。这对我来说毫无意义,也许这就是为什么我很难接受它的原因…看起来从公共课上学习应该更容易…谢谢你的帮助。我会让你知道它是怎么回事。@ghowell,如果这对你有帮助,请不要忘了检查选择的答案。@furkle-我喜欢你的最后一段,我同意你的观点-这是一个糟糕的设计。我发现内部类唯一有用的一次是提供一个基类的完全密封实现,其中子类从外部父类继承。我想您可能有一个拼写错误-您的意思是让spinslot()中的每个null检查都调用FrootUpdate1吗?