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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В С++ - friend, а в С# - что? аналог friend в C# 
:(
    Опции темы
bvn13
Дата 13.8.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А подскажите, пожалуйста. В С++ есть возможность для класса дать доступ к приват-данным другим функциям/классам с помощью конструкции friend. А есть ли аналог такого в C#? Просто хочу в классе иметь одно свойство (переменную типа string) в привате, но для определенных (других) классов дать к ней полный доступ. Классы не наследуются. Как такое написать?



Что-то типа вот такого:

Код


class CL1 {
   private CL2 class2;

   public ИзменитьПриватноеСвойствоКласса2() {
      CL2.ПриватноеСвойство = "ну вот что-то такое";
   }
}

class CL2 {
   private string ПриватноеСвойтсво;
}



Добавлено через 14 минут и 20 секунд
сам нашел. Ссылка: 

Аналог friend в С#

цитата:

Цитата

Есть, конечно. Ключевое слово internal встречали?
Это и есть аналог friend.

Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки.

PM MAIL   Вверх
ДобренькийПапаша
Дата 13.8.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В C# есть мощный механизм, который называется свойства))))
Вы сохраняете инкапсуляцию, объявляя поле как private, но получаете к нему доступ через public свойство, например:

Код

class ProcParams
    {
        private string paramName;
        private SqlDbType dbType;
        private int size;
        private Object value;
        private ParameterDirection direction;

        public ProcParams(string parameterName, SqlDbType dbType,
                                                int size, Object value, ParameterDirection direction)
        {
            this.paramName = parameterName;
            this.dbType = dbType;
            this.size = size;
            this.value = value;
            this.direction = direction;
        }

        public string ParamName
        {
            get { return paramName; }

        }

        public SqlDbType DbType
        {
            get { return dbType; }
        }

        public int Size
        {
            get { return size; }
        }

        public object Value
        {
            get { return value; }
        }

        public ParameterDirection Direction
        {
            get { return direction; }
        }
    }




Теперь к полям класса можно обратиться так:
Код

ProcParams ex=new ProcParams(//передаю всё что надо в конструктор)
{
   string paramName = ex.ParamName; //через свойство обращаюсь к private полю
}

кроме get (если задн только get вы сможете только читать), можно ещё добавить set (на запись).

Вобщем гуглите свойства C#.NET

Это сообщение отредактировал(а) ДобренькийПапаша - 13.8.2009, 15:08


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(bvn13 @  13.8.2009,  14:50 Найти цитируемый пост)

Есть, конечно. Ключевое слово internal встречали?
Это и есть аналог friend.

Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки.

И причем тут вообще friend?

Это сообщение отредактировал(а) azesmcar - 13.8.2009, 15:22
PM   Вверх
bvn13
Дата 13.8.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ДобренькийПапаша @ 13.8.2009,  15:06)
В C# есть мощный механизм, который называется свойства))))
Вы сохраняете инкапсуляцию, объявляя поле как private, но получаете к нему доступ через public свойство, например:

Код

...



Теперь к полям класса можно обратиться так:
Код

...
   string paramName = ex.ParamName; //через свойство обращаюсь к private полю
...

кроме get (если задн только get вы сможете только читать), можно ещё добавить set (на запись).

Вобщем гуглите свойства C#.NET

Да, об этом я знаю. Но когда я объявляю эти get и set, то эти свойства открываются для всех участков кода, где подключен namespace. А мне нужно только для определенных классов дать возможность работать с этими свойствами. Такое возможно?

Добавлено через 1 минуту и 4 секунды
Цитата(azesmcar @ 13.8.2009,  15:20)
Цитата(bvn13 @  13.8.2009,  14:50 Найти цитируемый пост)

Есть, конечно. Ключевое слово internal встречали?
Это и есть аналог friend.

Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки.

И причем тут вообще friend?

эм...... поясните, пожалуйста.  smile 
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(bvn13 @  13.8.2009,  15:38 Найти цитируемый пост)
эм...... поясните, пожалуйста.  smile  

friend - разрешает доступ функции/классу к приватным членам другого класса.
internal - Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки.

friend - разрешает доступ, internal - спецификатор доступа...не вижу ничего общего между ними.
PM   Вверх
bvn13
Дата 13.8.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @ 13.8.2009,  15:43)
Цитата(bvn13 @  13.8.2009,  15:38 Найти цитируемый пост)
эм...... поясните, пожалуйста.  smile  

friend - разрешает доступ функции/классу к приватным членам другого класса.
internal - Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки.

friend - разрешает доступ, internal - спецификатор доступа...не вижу ничего общего между ними.

а что значит "доступен для всех классов внутри одной сборки"? Имеется в виду один namespace? Или один проект? или что?
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(bvn13 @  13.8.2009,  15:49 Найти цитируемый пост)
а что значит "доступен для всех классов внутри одной сборки"? Имеется в виду один namespace? Или один проект? или что? 

http://en.wikipedia.org/wiki/.NET_assembly
PM   Вверх
bvn13
Дата 13.8.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ДобренькийПапаша @  13.8.2009,  15:06 Найти цитируемый пост)
В C# есть мощный механизм, который называется свойства))))



Может, я не понятно написал.... Попробую пояснить. Мне надо, чтобы одно конкретное свойство класса А было доступно (для записи и чтения) только из методов класса В, а из других мест - только для чтения. Так возможно сделать?
PM MAIL   Вверх
diadiavova
Дата 13.8.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(bvn13 @  13.8.2009,  16:54 Найти цитируемый пост)
Мне надо, чтобы одно конкретное свойство класса А было доступно (для записи и чтения) только из методов класса В, а из других мест - только для чтения. Так возможно сделать?

Если речь об одном свойстве, то - нет. Можно сделать так, чтобы все члены класса А были видны их В, для этого В надо вложить в А
Код

    public class A
    {
        private int anyField=3;
        public class B
        {
            public int GetAnyFieldValue(A aObj)
            {
                return aObj.anyField;
            }
        }
    }


И теперь код
Код

            var aaa = new A();
            var bbb = new A.B();
            MessageBox.Show(bbb.GetAnyFieldValue(aaa).ToString());


Выведет значение приватного поля класса А.


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


Эксперт
***


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

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



Уважаемый bvn13, а зачем вы себе так мозг канифолите может скажете? Зачем вам ТАКАЯ инкапсуляция, что вы там такое скрываете?


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Skynin
Дата 13.8.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Аналога в C# нет. (тот кто написал "internal Это и есть аналог friend". просто не в курсе что такое friend в C++ или internal в C#)
Как и многих других вещей из С++. навскидку - const методов.

Вобщем рекомендую изучать С# отдельно, не оглядываясь на С++, потому что у С++ куда больше синтаксических наворотов и возможностей. А если еще и вспомнить про указатели... "Забудьте" С++ быстрее получится изучить C#

PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
bvn13
Дата 13.8.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ДобренькийПапаша @ 13.8.2009,  17:35)
Уважаемый bvn13, а зачем вы себе так мозг канифолите может скажете? Зачем вам ТАКАЯ инкапсуляция, что вы там такое скрываете?

Зачем? Да это очень удобно.

Есть у меня два класса. Один может быть использован независимо от второго (Это и предполагается). А во втором есть переменная с типом первого класса. Но есть в первом классе переменная Идентификатор, которая должна быть в режиме только для чтения. Везде. За исключением второго класса, откуда она устанавливается, предварительно найденная в базе данных. Как на С++ такое делать знаю, а вот как на С# - нет...

Добавлено через 2 минуты и 38 секунд
Цитата(Skynin @  13.8.2009,  19:51 Найти цитируемый пост)
"Забудьте" С++ быстрее получится изучить C#


Эх, забыть... Это очень интересная и полезная вещь в С++... smile Как ее забыть?

Вот мне интересно, неужели в Шарпее вообще невозможно дать доступ к приватной части класса для "узкого круга" процедур?
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



bvn13

Дружба - эта самое сильное взаимоотношение классов (ниже по ступеньке идет наследование), очень желательно ее избегать, настолько желательно, что микрософт решила убрать дружественные функции и классы из C#.
PM   Вверх
bvn13
Дата 13.8.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Skynin @  13.8.2009,  19:51 Найти цитируемый пост)
тот кто написал "internal Это и есть аналог friend"


Уважаемый, я вот уже несколько часов в поисках по интернету... не могу найти, что же значит это "Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки". Не могли бы Вы пояснить, мне несведующему?

Добавлено через 1 минуту и 18 секунд
Цитата(ДобренькийПапаша @  13.8.2009,  17:35 Найти цитируемый пост)
что вы там такое скрываете? 


Объекты базы данных. smile
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(bvn13 @  13.8.2009,  20:36 Найти цитируемый пост)
Уважаемый, я вот уже несколько часов в поисках по интернету... не могу найти, что же значит это "Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки". Не могли бы Вы пояснить, мне несведующему? 

Ты же сам писал.

Цитата(bvn13 @  13.8.2009,  14:50 Найти цитируемый пост)
Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки.

а что такое сборка - я ответил ссылкой, ты ведь не лекции по C# здесь ожидаешь увидеть?

Вот, немного процитирую
Цитата

The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly, as in this example:

http://msdn.microsoft.com/en-us/library/7c...28VS.80%29.aspx

что такое сборка (assembly)
Цитата

An assembly is a fundamental building block of any .NET Framework application. For example, when you build a simple C# application, Visual Studio creates an assembly in the form of a single portable executable (PE) file, specifically an EXE or DLL.

http://msdn.microsoft.com/en-us/library/ms...28VS.80%29.aspx

Например, ты можешь написать DLL, в классах этой DLL использовать спецификатор доступа internal, он будет доступен всем методам в DLL, но пользователь библиотеки не будет иметь доступ к ней. Есть еще protected internal, почитай в MSDN.

Это сообщение отредактировал(а) azesmcar - 13.8.2009, 20:48
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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