2016-08-29 34 views
1

我知道我需要幫助的東西並不叫做父母,但這是我能想到的最接近的詞來描述這種情況。從不同範圍運行的方法

這不是我正在使用的實際代碼。

我有MainClass其中包含對象ObjectA

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

} 

我需要從ObjectA對象訪問mode變量。這可能嗎?我覺得如果我至少可以從obj中調用MainClass中的一個方法,我會全部設置。此外,我知道在這種意義上調用MainClass家長是不正確的,在這個MainClassobj這兩個是什麼正確的術語。

+0

我也會搜索這個,如果我可以但我不知道搜索條件,所以謝謝誰幫助! –

+0

我假設你可以改變'ObjectA'? – BradleyDotNET

+0

您正在尋找的編程概念被稱爲「範圍」。我建議先回顧一下這個概念,然後重點關注C#中的變量和方法範圍。 – Brandon

回答

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 
+0

謝謝我認爲這是可能的事件,但不知道如何實施。謝謝大家! –

+0

@iglooJuan偉大的代碼,但看起來有點過度工程))) –

+0

@VadimSentyaev可能是,但非常教育永遠不會少。對於任何碰到它的人來說,他們都可以把它用於其他目的:) – Noctis

0

您必須連線才能讓孩子知道父母的工作方式。事情是這樣的:

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; 
    } 
} 
-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; 
    } 
    } 
} 
0

即使你已經得到了答案,你也可以簡單地將它注入你的ObjectA ......有一個構造函數,它接受一個int值,當你創建該對象時,傳入mode並將其保存在該對象中。

我發現它更簡潔,對象使用任何它需要的範圍,而不是訪問父對象來請求變量。
我不是說可能不需要它,它只是另一個想法。