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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к объекту другого класса, Доступ к объекту другого класса 
V
    Опции темы
Буратиныч
Дата 20.6.2013, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как получить доступ к объекту другого класса? В данном примере к уже созданной и пополняемой из разных мест программы коллекции mylist_  ?

Код

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> mylist_1 = new List<string>();
        }
        List<string> mylist_2 = new List<string>();
    }


    class MyClass
    {
         mylist_ ???
        Program prg = new Program();
        
    }
}

PM MAIL   Вверх
vrann
Дата 20.6.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если я правильно понял попрос, тебе нужно получить доступ к переменным mylist_1 и mylist_2.

Самое простое решение дать доступ к переменным mylist, объявив их как public.

Выглядеть будет так:

namespace ConsoleApplication1
{
    class Program
    {
        public List<string> mylist_1;
        public List<string> mylist_2;

        static void Main(string[] args)
        {
            mylist_1 = new List<string>();
        }
        mylist_2 = new List<string>();
    }
    class MyClass
    {         
        Program prg = new Program();
         prg.mylist_1 - обращение к первой переменной. Аналогично можно обратиться ко второй
        
    }
}
PM MAIL   Вверх
Буратиныч
Дата 20.6.2013, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему то не хочет создаваться экземпляр prg, да и коллекции тоже не обнаруживаются из класса MyClass.

Задача в целом такая: обращаться к коллекции из любого места программы, в т.ч. и при создании и использовании экземпляра класса.
PM MAIL   Вверх
vrann
Дата 20.6.2013, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так, я ошибся немного. 
Смотри. Метод static void Main(string[] args) является рулящим твоей прогой в данный момент. Т.е. если ты хочешь использовать класс MyClass, объявлять его нужно именно в этом методе, а не наоборот. А вот колекции ты можешь загнать в используемый класс. Вот так например:
Код

namespace ConsoleApplication2
{
    class Program
    { 
        static void Main(string[] args)
        {            
            MyClass my = new MyClass();
            //my.mylist_1 - обращение
        }        
    }

    class MyClass
    {
        public List<string> mylist_1;
        public List<string> mylist_2;

        public MyClass()
        {
            mylist_1 = new List<string>();
            mylist_2 = new List<string>();
        }
    }
}

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


Шустрый
*


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

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



А можно ли из рулиемого класса обратиться к рулящему?

Код

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass my = new MyClass();
            my.mylist_1.Add("hello");

            MyAnotherClass mac = new MyAnotherClass();
        }
    }

    class MyClass
    {
        public List<string> mylist_1;

        public MyClass()
        {
            mylist_1 = new List<string>();
        }
    }

    class MyAnotherClass
    {
        my.mylist_1.Add("world");   !!!!!!! ошибка
    }
}

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


Эксперт
***


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

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



Цитата(Буратиныч @  20.6.2013,  17:28 Найти цитируемый пост)
А можно ли из рулиемого класса обратиться к рулящему?

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

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

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


Шустрый
*


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

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



Что такое синглтон? Попробовал через статику, но увы

Код

namespace ConsoleApplication2
{
    class Program
    {
        private static List<string> mylist; 
        static void Main(string[] args)
        {
            mylist = new List<string>();
            mylist.Add("hello");
        }
    }

    class MyAnotherClass
    {
        mylist.Add("world");   !!!!!!! ошибка
    }
}


Не знаю какую альтернативу можно придумать. Просто пытаюсь обратиться к члену вне класса при инициализации.

Добавлено через 11 минут и 33 секунды
Пока я вижу только вариант отправлять лист для наполнения в тот или иной метод по ссылке ref. Но это же ведь его надо везде указывать в аргументах. Не очень удобно, по-моему.

Добавлено через 13 минут и 33 секунды
Короче, это коллекция для логов, которая собирает инфу о том, что происходит в разных уголках программы.
PM MAIL   Вверх
Экскалупатор
Дата 20.6.2013, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Буратиныч @  20.6.2013,  17:56 Найти цитируемый пост)
Попробовал через статику, но увы

Код

    class Program
    {
       public static List<string> mylist = new List<string>();; //должен быть открытым
        static void Main(string[] args)
        {
            Program.mylist.Add("hello");
        }
    }

//обращаться так:
    class MyAnotherClass
    {
public void DoSomesing()
{
        Program.mylist.Add("world");   //че то добавляем
    }


надо подучить модификаторы доступа...

Добавлено @ 19:55
Синглтон - паттерн проектирования

Добавлено @ 19:58
Цитата(Буратиныч @  20.6.2013,  17:56 Найти цитируемый пост)
Короче, это коллекция для логов, которая собирает инфу о том, что происходит в разных уголках программы. 

    не стоит изобретать велосипед в этом вопросе. все уже давно изобретено. к примеру log4net уже дает весь требуемый функционал, и дает кучу всяких плюшек, к примеру, формат записи в лог или сохранение в файл/базу

Это сообщение отредактировал(а) Экскалупатор - 20.6.2013, 20:00
PM MAIL ICQ   Вверх
Буратиныч
Дата 20.6.2013, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



cool!  smile 
Имеет ли только смысл выносить переменную в отдельный класс с модификатором статик?

Код

    static class Stat
    {
        public static List<string> mylist = new List<string>();
        
    }

PM MAIL   Вверх
Экскалупатор
Дата 20.6.2013, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

P.S. повторюсь, лучше взять готовый модуль для логирования, иначе может возникнуть много проблем, особенно с параллельной обработкой этой коллекции.
PM MAIL ICQ   Вверх
dzaraev
Дата 28.6.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Буратиныч, поймите правильно - вам стоит почитать про основы языка, на котором вы собираетесь писать: http://msdn.microsoft.com/ru-ru/library/zk...f(v=vs.90).aspx
Экскалупатор, наверное пока нет особого смысла грузить человека log4net'ами и синглтонами, т.к. для начала неплохо бы разобраться в статическом контексте вообще. 

По поводу самого вопроса:
Цитата(Буратиныч @  20.6.2013,  18:56 Найти цитируемый пост)
Короче, это коллекция для логов, которая собирает инфу о том, что происходит в разных уголках программы. 

Значит, вам просто нужен простейший список лог-сообщений. В простейшем случае можно сделать так:


Код

namespace ConsoleApplication2 {
    internal class Program {
        private static void Main(string[] args) {
            MyAnotherClass workClass = new MyAnotherClass();
            workClass.DoWork();
        }
    }

    internal class MyAnotherClass {
        public void DoWork() {
            MyLog.Write("Работа сделана!");
        }
    }

    //если мы хотим использовать лог в других сборках - необходимо сделать класс публичным
    public static class MyLog {
        private static List<string> logMessages = new List<string>();

        public static void Write(string message) {
            logMessages.Add(message);
            //также здесь можно добавить код записи лога в файл, например
        }
    }
}


То, что вы пишете
Цитата

Задача в целом такая: обращаться к коллекции из любого места программы

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

и далее
Цитата

, в т.ч. и при создании и использовании экземпляра класса. 

вот это требование немного не понял, если что - уточните, попробую ответить.

Это сообщение отредактировал(а) dzaraev - 28.6.2013, 20:23
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Буратиныч
Дата 28.6.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В целом со статикой я разобрался, всем спасибо! Но остался подвешенным вопрос, если я пишу под WPF как я могу из объекта какого-либо класса обратиться к членам входного класса, т.е public partial class MainWindow : Window ?
PM MAIL   Вверх
dzaraev
Дата 28.6.2013, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Буратиныч @  28.6.2013,  20:39 Найти цитируемый пост)
 обратиться к членам входного класса

Что вы имеете в виду под "входным классом" ? Если имеется в виду базовый класс (т.е. тот, от которого наследуется ваш класс),
то вы можете из вашего класса обращаться к тем членам базового класса, которые помечены модификаторами public, protected или protected internal. 
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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