2010-03-30 3 views
5

У меня есть класс, в котором метод вызывает вложенный класс. Я хочу получить доступ к свойствам родительского класса из вложенного класса.Вложенный класс - вызов вложенного класса из родительского класса

public class ParentClass 
{ 
    private x; 
    private y; 
    private z; 

    something.something = new ChildClass(); 

    public class ChildClass 
    { 
     // need to get x, y and z; 
    } 
} 

Как получить доступ к x, y и z из дочернего класса? Что-то связанное со ссылкой на родительский класс, но как?

+0

Благодаря Заку для показа кода я возникли трудности при размещении кода в – insanepaul

+0

возможного дубликата (HTTP: // StackOverflow .com/questions/185124/whats-the-best-way-of-access-the-control-in-the-enclosing-class-from-the-nes) – nawfal

ответ

8

Используйте this ключевое слово, чтобы передать ссылку на 'себя' в конструкторе ChildClass. [Что это лучший способ получить доступ контроля в классе ограждающей от вложенного класса] -

public class ParentClass 
{ 
    public X; 
    public Y; 
    public Z; 

    // give the ChildClass instance a reference to this ParentClass instance 
    ChildClass cc = new ChildClass(this); 

    public class ChildClass 
    { 
     private ParentClass _pc; 

     public ChildClass(ParentClass pc) { 
      _pc = pc; 
     } 

     // need to get X, Y and Z; 
     public void GetValues() { 
      myX = _pc.X 
      ... 
     } 
    } 
} 
+0

Спасибо, это очень понятно для меня, чтобы понять. Его ключевое слово «this», которое я не знал около. – insanepaul

2

См. http://www.codeproject.com/KB/cs/nested_csclasses.aspx подробное руководство по использованию вложенных классов в C#. Я думаю, что вы ищете что-то вроде:

class OuterClass 
{ 
    public int y = 100; 

    public class NestedClass 
    { 
     public static void abc() 
     { 
      OuterClass oc = new OuterClass(); 
      System.Console.WriteLine(oc.y);  
     } 
    } 
} 

Итак, для того, чтобы получить доступ к полям внешнего класса, необходим экземпляр внешнего класса доступен для внутреннего класса.

Имейте в виду, что вы можете получить доступ к статическим полям из внутреннего класса без экземпляра внешнего класса вокруг:

class OuterClass 
{ 
    public static int y = 100; 

    public class NestedClass 
    { 
     public static void abc() 
     { 
      System.Console.WriteLine(OuterClass.y);  
     } 
    } 
} 
+0

Он хотел получить доступ к свойствам из внешнего класса изнутри вложенный класс. Вместо этого, я думаю, все, что вы сделали, снова создало внешний класс ... и затем обратился к свойствам. –

+0

Вы правы. Вероятно, вам нужно будет передать существующую ссылку на внешний класс, как упоминалось Лусеро или Исааком. –

+0

Да, это то, что я продолжаю читать, но как мне сделать существующую ссылку? – insanepaul

2

Вам нужно передать ссылку на экземпляр родительского класса, например, в конструктор ChildClass. Конечно, вы можете получить доступ к полям ParentClass, если они являются статическими.

Примечание. Если вы когда-либо делали Java, C# поддерживает только понятие «статического» внутреннего класса.

+0

Это то, чего я не получаю, и я знаю его основные, но как передать ссылку на конструктор. Конечно, я могу добавить родительский класс к конструктору вложенного класса, но то, что я передаю в методе родительского класса, который вызывает конструктор дочернего класса. Я заметил, что я могу получить доступ к статическим свойствам, к сожалению, ни один из моих :( – insanepaul

2

Ну, на конструкторе вашего вложенного класса передайте ссылку на внешний класс. Таким образом вы можете получить доступ к свойствам родительского класса из вложенного класса.

Кроме того, стоит отметить, что статические свойства родительского класса доступны для вас.

http://en.csharp-online.net/Nested_Classes

Пример:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Application { 
    class OuterClass { 
     int someProperty = 10; 

     class NestedClass { 
      OuterClass reference; 

      public NestedClass(OuterClass r) { 
       reference = r; 
      } 

      public void DoSomething() { 
       Console.Write(reference.someProperty); 
      } 
     } 

     public OuterClass() { 
      NestedClass nc = new NestedClass(this); 
      nc.DoSomething(); 
     } 
    } 

    class Test { 
     public static void Main(string[] args) { 
      OuterClass oc = new OuterClass(); 
     } 
    } 
} 
+0

Это то, что я не получаю, и я знаю его основное, но как передать ссылку на конструктор. Конечно, я могу добавить родительский класс в конструктор вложенного класса, но что я передаю в методе родительского класса, который вызывает конструктор дочернего класса.Я заметил, что я могу получить доступ к статическим свойствам, к сожалению, ни один из моих :( – insanepaul

+0

Отправленный пример для более полного ответа. Обратите внимание, что конструктор OuterClass создает новый NestedsClass, а NestedClass обращается к свойству someProperty "из OuterClass. –

+0

Должен ли я создать новый вложенный класс из конструктора внешнего класса? Я мог бы вызвать вложенный конструктор класса с помощью метода из внешнего класса с параметром« this », например ... thing.ItemTemplate = new nestedclass (this); ... Вы видите, что вся работа выполняется во вложенном классе, и метод из внешнего класса вызывает его. Во всяком случае, я сделал быструю проверку и, похоже, работает. должен был передать ключевое слово «this» – insanepaul

Смежные вопросы