none
Обращение к внешнему типу из вложенного RRS feed

  • Вопрос

  • Уточните, пожалуйста. В двух примерах msdn рекомендует немного разные вещи для одного и того же. Примеры:

    public class Container
    {
        public class Nested
        {
            private Container parent;
    
            public Nested()
            {
            }
            public Nested(Container parent)
            {
                this.parent = parent;
            }
        }
    }

    В этом примере рекомендуется добавлять конструктор для доступа к вмещающему типу.

    // CS0038.cs
    class OuterClass
    {
       public int count;
       // try the following line instead
       // public static int count;
    
       class InnerClass
       {
          void func()
          {
             // or, create an instance
             // OuterClass class_inst = new OuterClass();
             // int count2 = class_inst.count;
             int count2 = count;   // CS0038
          }
       }
    
       public static void Main()
       {
       }
    }

    А здесь рекомендуется создание экземпляра вмещающего типа во вложенном типе для использования вмещающего.В чем разница этих подходов, и как они работают?

    22 октября 2015 г. 7:09

Ответы

  • Добрый день.

    Первый подход нужен, когда дочерний класс должен иметь ссылку на объект который будет являться для него родителем. Например, элементы дерева, хотят иметь доступ к объекту описывающему дерево.

    Второй подход мутноват, и да, хотелось бы ссылку. Но если я его правильно понимаю, то он нужен когда нам нужен произвольный объект родительского класса, для решения задач дочернего класса. Например, родительский класс считывает показания датчика и сколько бы мы экземпляров не создали они все в поле count будут иметь одно и то-же значение (почему это класс не статический отдельный вопрос...).

    Ну и если будут ссылки, то можно ответить более предметно.

    • Помечено в качестве ответа Энтомолог 23 октября 2015 г. 14:31
    23 октября 2015 г. 6:47
    Отвечающий
  • Первое, это как я и написал один из вариантов как вложенный тип может получить для своих нужд ссылку на родительский. Во многих случаях можно обойтись даже без передачи ссылки на родителя. Вторая ссылка, это ошибка компиляции. Ну и там написан подход, который ошибку устраняет, но практически применим только а очень ограниченном ряде случаев. Например, как в приведенном выше примере. Лучше, создавая дочерний объект, если ему необходимо ограниченно взаимодействовать с родительским, использовать подписывание на события. Ну, или взаимодействий много, передавать ссылку на родительский объект, как в первом примере.
    • Помечено в качестве ответа Энтомолог 26 октября 2015 г. 6:24
    26 октября 2015 г. 6:20
    Отвечающий

Все ответы

  • Откуда вы этот пример взяли, можно ссылку?

    Сделаем содержимое сообщества лучше, вместе!

    23 октября 2015 г. 6:23
    Модератор
  • Добрый день.

    Первый подход нужен, когда дочерний класс должен иметь ссылку на объект который будет являться для него родителем. Например, элементы дерева, хотят иметь доступ к объекту описывающему дерево.

    Второй подход мутноват, и да, хотелось бы ссылку. Но если я его правильно понимаю, то он нужен когда нам нужен произвольный объект родительского класса, для решения задач дочернего класса. Например, родительский класс считывает показания датчика и сколько бы мы экземпляров не создали они все в поле count будут иметь одно и то-же значение (почему это класс не статический отдельный вопрос...).

    Ну и если будут ссылки, то можно ответить более предметно.

    • Помечено в качестве ответа Энтомолог 23 октября 2015 г. 14:31
    23 октября 2015 г. 6:47
    Отвечающий
  • Жду более предметного ответа. Спасибо.
    23 октября 2015 г. 18:32
  • Первое, это как я и написал один из вариантов как вложенный тип может получить для своих нужд ссылку на родительский. Во многих случаях можно обойтись даже без передачи ссылки на родителя. Вторая ссылка, это ошибка компиляции. Ну и там написан подход, который ошибку устраняет, но практически применим только а очень ограниченном ряде случаев. Например, как в приведенном выше примере. Лучше, создавая дочерний объект, если ему необходимо ограниченно взаимодействовать с родительским, использовать подписывание на события. Ну, или взаимодействий много, передавать ссылку на родительский объект, как в первом примере.
    • Помечено в качестве ответа Энтомолог 26 октября 2015 г. 6:24
    26 октября 2015 г. 6:20
    Отвечающий