C# 从不同范围运行方法
我知道我需要帮助的不是父母,但这是我能想到的最接近描述这种情况的词 这不是我正在使用的实际代码 我有C# 从不同范围运行方法,c#,C#,我知道我需要帮助的不是父母,但这是我能想到的最接近描述这种情况的词 这不是我正在使用的实际代码 我有MainClass,它包含objectObjectA class MainClass { public int mode = 0; ObjectA obj = new ObjectA(); } 我需要从ObjectA对象访问模式变量。这可能吗?我觉得如果我至少可以从obj调用MainClass中的一个方法,我就可以全部设置好了。另外,我知道在这个意义上调用MainClass父类
MainClass
,它包含objectObjectA
class MainClass
{
public int mode = 0;
ObjectA obj = new ObjectA();
}
我需要从
ObjectA
对象访问模式
变量。这可能吗?我觉得如果我至少可以从obj
调用MainClass
中的一个方法,我就可以全部设置好了。另外,我知道在这个意义上调用MainClass
父类是不正确的,在这个意义上,MainClass
和obj
的正确术语是什么。你必须把事情联系起来,让孩子知道父类,这样才能起作用。大概是这样的:
class ParentClass
{
public int mode = 0;
public ChildClass child = null;
public ParentClass()
{
child = new ChildClass(this);
}
}
class ChildClass
{
public readonly ParentClass parent = null;
public ChildClass (ParentClass parent)
{
this.parent = parent;
}
public int MethodThatReadsParentMode()
{
int mode = parent.mode;
return mode;
}
}
假设您能够更改
MainClass
,我可以想到两个选项:
- 创建
实例时,添加对ObjectA
的引用MainClass
- 就像你在评论中说的,使用事件
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));
}
}
}
使用事件:
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
您将字段
mode
public,因此我假设使用classMainClass
do的人可能会更改此字段
让我们假设程序看起来像这样
class Program {
var main = new MainClass();
main.mode = 1;
}
您的obj
字段是私有的,因此Program
无法访问它。
因此,当有人更改了字段模式
,对象A
应该得到字段模式
的新值。
可能的解决办法:
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; }
}
}
在案例字段模式
属于maincals
中还有另一个选项
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;
}
}
}
即使你已经得到了答案,你也可以简单地将它注入你的
对象a
。。。有一个接受int的构造函数,当您创建对象时,将模式
传入并保存到该对象中
我发现对象从其作用域中使用它所需要的任何东西,而不是访问父对象来请求变量,这一点更清楚。我不是说可能不需要它,这只是另一种想法。如果可以,我也会搜索这个,但我不知道搜索所需的术语,所以感谢您的帮助!我假设您可以更改
ObjectA
?您正在寻找的编程概念称为“范围”。我建议先回顾一下这个概念,然后关注C#中的变量和方法范围。谢谢这个术语。我被允许更改ObjectA。我要看看是否可以使用事件或其他系统,因为我需要在非常特定的时间运行一个方法。如果不是的话,我会另找一条路。谢谢谢谢你,我认为这是可能的事件,但不知道如何实施。非常感谢@iglooJuan很棒的代码,但是看起来有点过度设计了。)@VadimSentyaev可能是,但是非常有教育意义。对于偶然发现它的任何其他人,他们可以将其用于其他目的:)