从不同范围运行方法

时间:2016-08-29 23:58:50

标签: c#

我知道我需要帮助的不是父母,但这是我能想到的最接近的词来描述这种情况。

这不是我正在使用的实际代码。

我的MainClass包含对象ObjectA

class MainClass
{
    public int mode = 0;
    ObjectA obj = new ObjectA();

}

我需要从mode对象访问ObjectA变量。这可能吗?我觉得如果我至少可以在MainClass obj中调用一个方法,那么我将会全部设定。此外,我知道在这种意义上调用MainClass父母是不正确的,这里MainClassobj的正确用语是什么。

4 个答案:

答案 0 :(得分:4)

假设您能够更改MainClass,我可以考虑两个选项:

  • 在您创建MainClass实例时添加对ObjectA的引用。
  • 就像你在评论中所说,使用事件。

使用参考:

class MainClass
{
    public int mode = 31416;
    ObjectA obj;

    public MainClass() 
    {
        obj = new ObjectA(this);
    }

    public int GetMainClassMode() 
    {
        return mode;
    }

    public void Test() {
        Console.WriteLine("Calling test method inside obj");
        obj.Test();
    }
}

class ObjectA {

    MainClass parent = null;

    public ObjectA(MainClass parent) 
    {
        this.parent = parent;
    }

    public void Test() 
    {
        if (parent != null) 
        {
            Console.WriteLine("Getting mode from 'parent' MainClass");
            Console.WriteLine(string.Format("Mode = {0}", parent.GetMainClassMode()));
        }
    }       
}

使用活动:

class MainClass
{
    public int mode = 31416;
    ObjectA obj = new ObjectA();


    public MainClass() 
    {
        obj.ValueReturnEvent += HandleValueReturnEvent;
    }

    public int GetMainClassMode() 
    {
        return mode;
    }

    // Handle event, return data
    private int HandleValueReturnEvent(object sender, EventArgs e)
    {
        return mode;
    }

    public void Test() {
        Console.WriteLine("Calling test method inside obj");
        obj.Test();
    }
}

class ObjectA {

    // delegate
    public delegate int ReturnValueEventHandler(object sender, EventArgs args);
    // event
    public event ReturnValueEventHandler ValueReturnEvent;


    public void Test() 
    {
        // make sure at least one subscriber
        if (ValueReturnEvent != null)  
        {
            // note the event is returning a value
            var myValue = ValueReturnEvent(this, null);

            Console.WriteLine("Getting mode from 'parent' MainClass");
            Console.WriteLine(string.Format("Mode = {0}", myValue));
        }
    }   
}

在这两种情况下,您都会获得此输出:

Calling test method inside obj
Getting mode from 'parent' MainClass
Mode = 31416

答案 1 :(得分:0)

你必须把事情联系起来,让孩子知道父母为此工作。像这样:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 123) {
        if (resultCode == Activity.RESULT_OK){
            // the code you want to execute
        }
    }
}

答案 2 :(得分:0)

即使你得到了答案,你也可以简单地将它注入你的ObjectA ...有一个带有int的构造函数,当你创建对象时,传递mode in并将其保存在该对象中。

我发现对象在其范围内使用它需要的任何东西,而不是访问父级来请求变量,这样更清楚。
我不是说它可能不需要,只是另一种想法。

答案 3 :(得分:-1)

您将字段mode公开,因此我认为使用类MainClass的人可以更改此字段。

让我们假设程序看起来像这样。

class Program {
  var main = new MainClass();
  main.mode = 1;
}

您的obj字段属于私有字段,因此Program无法访问该字段。 因此,当有人更改字段mode时,ObjectA应获取字段mode的新值。 可能的解决方案:

class ObjectA {
  public int Mode { get; set; }
}

class MainClass {
  private obj = new ObjectA();
  public int Mode {
    get { return this.obj.Mode; }
    set { this.obj.Mode = value; }
  }
}

如果字段mode属于MainCalss,则还有另一种选择。

class ObjectA {
  private int mode;
  public ObjectA(int mode) {
    this.mode = mode;
  }
  // you can create property instead of method
  // I'm not sure how you use this variable, so I just added set method
  public void SetMode(int mode) {
    this.mode = mode;
  }
}

class MainClass {
  private int mode = 0;
  private obj = new ObjectA();
  public int Mode {
    get { return this.mode; }
    set {
      this.obj.SetMode(value);
      this.mode = value; 
    }
  }
}