В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
В отличие от 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
, потому что никакое другое право доступа не было определено.
Вложенные типы не похожи на внутренние классы в Java - нет никакого свойственного экземпляра содержания типа. (Они больше похожи на статические вложенные классы в Java.) Они - эффективно отдельные классы с двумя отличиями:
Outer<int>.Nested
не то же как Outer<string>.Nested
. В отличие от 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";
}
}
}
Исправьте меня, если я неправ, Вы пытаетесь обработать внешнее управление от внутреннего класса следовательно, Вы столкнулись с этим. Лучший способ сделать это состоял бы в том, чтобы обработать дела управляемым событиями способом. Используйте Шаблон "наблюдатель", Регистрируют слушатель на внешнем управлении (Ваш вложенный/внутренний класс будет слушателем). Делает жизнь более простой. Я боюсь, что это не ответ, который Вы ожидали!
Вы могли передать класс включения в качестве параметра вложенному конструктору класса, как это:
private NestedClass _nestedClass;
public ParentClass()
{
_nestedClass = new NestedClass(this);
}
Вложенные классы обычно не рекомендуются и должны быть частными и/или внутренними. Они иногда, по-моему, полезны все же.