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

Поиск:

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


Новичок



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

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



Как реализовать доступ из вложенного класса к полям внешнего класса, например:

Код

class A
{

 public int a1; 

 class b()
 {

   int b1;

   b()
   {
    a1=b1  //нет доступа к a1
   }
 }
}


PM MAIL   Вверх
NightmareZ
Дата 4.8.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



Передавай в конструктор внутреннего класса ссылку на экземпляр внешнего.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
DsAEkb
Дата 4.8.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я временно так и сделал, но что-то мне внутренний голос подскзывает, что это кривое решение, есть ли каке-то еще способы?
PM MAIL   Вверх
diadiavova
Дата 4.8.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(DsAEkb @  4.8.2009,  14:05 Найти цитируемый пост)
нет доступа к a1

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



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
DsAEkb
Дата 4.8.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нет уж как раз чтобы это было поле класса не надо  smile , просто к полям экземпляра класса мы можем обратиться так:

Код

this.b1=123;


думал есть способ подобным образом обращаться к полям внешнего класса  smile 
PM MAIL   Вверх
mr.Anderson
Дата 4.8.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



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

public class Parent
{
    protected int _a;
    public int _b;
    private int _c;
    public Parent() { }
    public Parent(int a, int b, int c)
    {
        _a = a;
        _b = b;
        _c = c;
    }
}
public class Child : Parent
{
    public Child()
    {
        _a = 25; // доступно
        _b = 39; // доступно
        _c = 20; // НЕДОСТУПНО, ошибка компиляции
    }
}




--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
diadiavova
Дата 4.8.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(DsAEkb @  4.8.2009,  19:26 Найти цитируемый пост)
думал есть способ подобным образом обращаться к полям внешнего класса  

Внешний он или нет - не имеет значения. Это другой класс и у него свои экземпляры, а у вложенного - свои. Если бы такой способ был, то как ты различал бы разные экземпляры класса?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
DsAEkb
Дата 4.8.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё понятно, всем спасибо
PM MAIL   Вверх
Экскалупатор
Дата 5.8.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



все привет. вот прочел тему и возник у меня вопрос. вы утверждаете что не имеет значение вложенный ли класс или нет. предположим такую ситуацию: есть два класса. класс A и вложенный в него класс B. потом создаем еще один класс С, который никак изначально не связан ни с А ни с В. 
Код

 public class A
    {
        public class B
        {
        }
    }

Вопрос: если вложенность классов это "их логическое объединение" и это не на что не влияет, и это два самостоятельных класса, то как в классе С создать экземпляр класса В? у меня получилось, что экземпляр класса А можно, а класс В из класса С не видно... подскажите как?
PM MAIL ICQ   Вверх
diadiavova
Дата 5.8.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Экскалупатор, Просто в названии класса присутствует имя внешнего класса, но о его экземпляре нет речи.
Код

namespace NestedSmpl
{
    class Program
    {
        static void Main(string[] args)
        {
            var b = new A.B();
            Console.WriteLine(b.Hello());
            Console.ReadKey();
        }
    }

    public class A
    {
        public class B
        {
            public string Hello()
            {
                return "Hello";
            }
        }
    }
}



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 5.8.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



diadiavova, спасибо, что то я сразу не допер сам. 
PM MAIL ICQ   Вверх
mihryak
Дата 5.8.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 36



Цитата(mr.Anderson @  4.8.2009,  20:17 Найти цитируемый пост)
Вложение классов друг в друга есть всего лишь их логическое объединение, не более

не вполне
Код

    class A
    {
        private string a = "test";

        class B
        {
            public override string ToString()
            {
                return new A().a;
            }
        }
    }

PM MAIL ICQ   Вверх
mr.Anderson
Дата 7.8.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



mihryak, да, точно, доступ к приватным членам тоже будет.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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