Каков лучший способ получить доступ к полю в классе включения от вложенного класса?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

57
задан Jim Fell 27 May 2016 в 18:30
поделиться

5 ответов

В отличие от Java, вложенный класс не является специальным "внутренним классом", таким образом, необходимо было бы передать ссылку. У Raymond Chen есть пример, описывающий различия здесь: вложенные классы C# похожи на вложенные классы C++, не Java внутренние классы .

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

// C#
class OuterClass 
{
    string s;
    // ...
    class InnerClass 
    {
       OuterClass o_;
       public InnerClass(OuterClass o) { o_ = o; }
       public string GetOuterString() { return o_.s; }
    }
    void SomeFunction() {
        InnerClass i = new InnerClass(this);
        i.GetOuterString();
    }

}

Примечание, к которому InnerClass может получить доступ" s" OuterClass, я не изменил код Raymond (когда я связался с вышеупомянутым), поэтому помните, что" string s;" private, потому что никакое другое право доступа не было определено.

74
ответ дан Ray Hayes 24 November 2019 в 19:27
поделиться

Вложенные типы не похожи на внутренние классы в Java - нет никакого свойственного экземпляра содержания типа. (Они больше похожи на статические вложенные классы в Java.) Они - эффективно отдельные классы с двумя отличиями:

  • , Если содержание типа универсально, вложенный тип эффективно параметризован содержанием типа, например, Outer<int>.Nested не то же как Outer<string>.Nested.
  • Вложенные типы имеют доступ к членам парламента, не занимающим официального поста в содержании типа.
32
ответ дан Jon Skeet 24 November 2019 в 19:27
поделиться

В отличие от Java, в C# нет никакой неявной ссылки на экземпляр класса включения.

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

public partial class Form1 : Form
{
    private Nested m_Nested;

    public Form1()
    {
        InitializeComponent();

        m_Nested = new Nested(this);
        m_Nested.Test();
    }

    private class Nested
    {
        private Form1 m_Parent;

        protected Form1 Parent
        {
            get
            {
                return m_Parent;
            }
        }

        public Nested(Form1 parent)
        {
            m_Parent = parent;
        }

        public void Test()
        {
            this.Parent.textBox1.Text = "Testing access to parent Form's control";
        }
    }
}
12
ответ дан Jason Kresowaty 24 November 2019 в 19:27
поделиться

Исправьте меня, если я неправ, Вы пытаетесь обработать внешнее управление от внутреннего класса следовательно, Вы столкнулись с этим. Лучший способ сделать это состоял бы в том, чтобы обработать дела управляемым событиями способом. Используйте Шаблон "наблюдатель", Регистрируют слушатель на внешнем управлении (Ваш вложенный/внутренний класс будет слушателем). Делает жизнь более простой. Я боюсь, что это не ответ, который Вы ожидали!

1
ответ дан questzen 24 November 2019 в 19:27
поделиться

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

private NestedClass _nestedClass;
public ParentClass() 
{
   _nestedClass = new NestedClass(this);
}

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

0
ответ дан mannu 24 November 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: