Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вложенный класс 
V
    Опции темы
andrx
Дата 23.1.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

Репутация: 1
Всего: 4



К примеру имеется следуюющий код :
Код

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 - но и этот вариант мне не подходит.

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


--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Exception
Дата 23.1.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



А как это ты обращаешься к нестатическому члену, не имея при себе экземпляра? Вложенный класс 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);}
}


PM   Вверх
andrx
Дата 23.1.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

Репутация: 1
Всего: 4



Спасибо 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;
        }
    }

Помоему так проще, а ?!
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Exception
Дата 23.1.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Если А не нужно "знать" о В (то есть взаимодействовать с ним), то это наипростейшее решение.
PM   Вверх
Medved
Дата 24.1.2006, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



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


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
-ser-
Дата 24.1.2006, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



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();
            }
        }



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
VisualProgrammerNET
Дата 24.1.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



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


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
andrx
Дата 24.1.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

Репутация: 1
Всего: 4



Всем спасибо !

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

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


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

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

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

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

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

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

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

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

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

Это сообщение отредактировал(а) andrx - 24.1.2006, 19:23
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Medved
Дата 24.1.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



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

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


http://msdn.microsoft.com/library/default....html/boagag.asp


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.