Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вложенный класс


Автор: andrx 23.1.2006, 18:51
К примеру имеется следуюющий код :
Код

public class A
    {
        public int x;
        public class B
        {
            public int y;
            public B()
            {
                y = x; // <<< ОШИБКА <<<
            }
        }
        public A()
        {
            x = 1;
        }
    }

Подскажите, как во вложенном класе (в примере класс B) обратиться к члену класса который содержится в классе содержащий этот вложенный класс (в примере класс A) ?
Извините за сложную формулировку вопроса.
Можно объявить public static int x; - но мне этот вариант не подходит.
Можно объявить public class B : A - но и этот вариант мне не подходит.

Может есть еще способы ?
Заранее благодарен.


Автор: Exception 23.1.2006, 19:00
А как это ты обращаешься к нестатическому члену, не имея при себе экземпляра? Вложенный класс B на самом деле не имеет ничего общего с классом A. На самом деле компилятор создает класс с именем A$B, этим вся вложенность и определяется! В твоем примере можно поступить так:
Код
class A{
int x;
B myB;
class B{
int y;
B(A myA) {this.y = myA.x;}
}
A(){this.myB = new B(this);}
}


Автор: andrx 23.1.2006, 19:09
Спасибо Exception
Вы натолкнули меня на мысль. Ведь можно реализовать так :
Код

public class A
    {
        public int x;
        public class B
        {
            public int y;
            public B(ref A a)
            {
                y = a.x; // !!!
            }
        }
        public A()
        {
            x = 1;
        }
    }

Помоему так проще, а ?!

Автор: Exception 23.1.2006, 19:15
Если А не нужно "знать" о В (то есть взаимодействовать с ним), то это наипростейшее решение.

Автор: Medved 24.1.2006, 07:33
А для каких целей вы вообще собираетесь использовать вложенный класс? Можно поинтересоваться?

Автор: -ser- 24.1.2006, 08:35
andrx
Цитата

Помоему так проще, а ?!

полная бредятина. почему, подумай сам.

Exception. близко, но тоже не то. потому что внутри нестед класса
Код
this
не может использоваться для ссылки на инстанс члена содержащего типа.

вот классика, как должно быть на самом деле
Код

        class C
        {
            int i = 123;
         
            public void F()
            {
                Nested n = new Nested( this );
                n.G();
            }
            
            public class Nested
            {
                C this_c;
                public Nested( C c )
                {
                    this_c = c;
                }
                public void G()
                {
                    Console.WriteLine( this_c.i );
                }
            }
        }
        class Test
        {
            static void Main()
            {
                C c = new C();
                c.F();
            }
        }

Автор: VisualProgrammerNET 24.1.2006, 18:50
По-моему, правильнее как раз вариант Exception'a. В данном случае применяется обычное включение-делегирование (has-a inheritance). Зачем сюда припаивать ещё nested-класс?

Автор: andrx 24.1.2006, 19:21
Всем спасибо !

Для Pegas
Цитата(Pegas @ 24.1.2006, 07:33 Найти цитируемый пост)

А для каких целей вы вообще собираетесь использовать вложенный класс? Можно поинтересоваться?


Я их собираюсь использовать как вложенные классы по своей сути !

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

В итоге соглашусь с Exception
Цитата(Exception @ 23.1.2006, 19:15 Найти цитируемый пост)

Если А не нужно "знать" о В (то есть взаимодействовать с ним), то это наипростейшее решение

именно так я и реализовал !

Для -ser-
Цитата(-ser- @ 24.1.2006, 08:35 Найти цитируемый пост)

полная бредятина. почему, подумай сам.

Незнаю почему Вы так решили, если можно просветите.

Всем большое СПАСИБО.
С уважением - Андрей.

Автор: Medved 24.1.2006, 22:50
Цитата(andrx @ 24.1.2006, 22:21 Найти цитируемый пост)

Вложенные классы позволяют мне создать логически целестные и законченные классы.
Ну вообщем-то это еще и стиль - кто как пишет !!!


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/boagag.asp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)