| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > В С++ - friend, а в С# - что? |
| Автор: bvn13 13.8.2009, 14:50 | ||||
| А подскажите, пожалуйста. В С++ есть возможность для класса дать доступ к приват-данным другим функциям/классам с помощью конструкции friend. А есть ли аналог такого в C#? Просто хочу в классе иметь одно свойство (переменную типа string) в привате, но для определенных (других) классов дать к ней полный доступ. Классы не наследуются. Как такое написать? Что-то типа вот такого:
Добавлено через 14 минут и 20 секунд сам нашел. Ссылка: http://www.cyberforum.ru/csharp-net/thread26951.html цитата:
|
| Автор: ДобренькийПапаша 13.8.2009, 15:06 | ||||
| В C# есть мощный механизм, который называется свойства)))) Вы сохраняете инкапсуляцию, объявляя поле как private, но получаете к нему доступ через public свойство, например:
Теперь к полям класса можно обратиться так:
кроме get (если задн только get вы сможете только читать), можно ещё добавить set (на запись). Вобщем гуглите свойства C#.NET |
| Автор: bvn13 13.8.2009, 15:38 | ||||||||||
Да, об этом я знаю. Но когда я объявляю эти get и set, то эти свойства открываются для всех участков кода, где подключен namespace. А мне нужно только для определенных классов дать возможность работать с этими свойствами. Такое возможно? Добавлено через 1 минуту и 4 секунды
эм...... поясните, пожалуйста. |
| Автор: azesmcar 13.8.2009, 15:43 |
friend - разрешает доступ функции/классу к приватным членам другого класса. internal - Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки. friend - разрешает доступ, internal - спецификатор доступа...не вижу ничего общего между ними. |
| Автор: bvn13 13.8.2009, 15:49 | ||
а что значит "доступен для всех классов внутри одной сборки"? Имеется в виду один namespace? Или один проект? или что? |
| Автор: azesmcar 13.8.2009, 15:52 | ||
http://en.wikipedia.org/wiki/.NET_assembly |
| Автор: bvn13 13.8.2009, 15:54 | ||
Может, я не понятно написал.... Попробую пояснить. Мне надо, чтобы одно конкретное свойство класса А было доступно (для записи и чтения) только из методов класса В, а из других мест - только для чтения. Так возможно сделать? |
| Автор: diadiavova 13.8.2009, 17:26 | ||||||
Если речь об одном свойстве, то - нет. Можно сделать так, чтобы все члены класса А были видны их В, для этого В надо вложить в А
И теперь код
Выведет значение приватного поля класса А. |
| Автор: ДобренькийПапаша 13.8.2009, 17:35 |
| Уважаемый bvn13, а зачем вы себе так мозг канифолите может скажете? Зачем вам ТАКАЯ инкапсуляция, что вы там такое скрываете? |
| Автор: Skynin 13.8.2009, 19:51 |
| Аналога в C# нет. (тот кто написал "internal Это и есть аналог friend". просто не в курсе что такое friend в C++ или internal в C#) Как и многих других вещей из С++. навскидку - const методов. Вобщем рекомендую изучать С# отдельно, не оглядываясь на С++, потому что у С++ куда больше синтаксических наворотов и возможностей. А если еще и вспомнить про указатели... "Забудьте" С++ быстрее получится изучить C# |
| Автор: bvn13 13.8.2009, 20:32 | ||
Зачем? Да это очень удобно. Есть у меня два класса. Один может быть использован независимо от второго (Это и предполагается). А во втором есть переменная с типом первого класса. Но есть в первом классе переменная Идентификатор, которая должна быть в режиме только для чтения. Везде. За исключением второго класса, откуда она устанавливается, предварительно найденная в базе данных. Как на С++ такое делать знаю, а вот как на С# - нет... Добавлено через 2 минуты и 38 секунд Эх, забыть... Это очень интересная и полезная вещь в С++... Вот мне интересно, неужели в Шарпее вообще невозможно дать доступ к приватной части класса для "узкого круга" процедур? |
| Автор: azesmcar 13.8.2009, 20:36 |
| bvn13 Дружба - эта самое сильное взаимоотношение классов (ниже по ступеньке идет наследование), очень желательно ее избегать, настолько желательно, что микрософт решила убрать дружественные функции и классы из C#. |
| Автор: bvn13 13.8.2009, 20:36 |
Уважаемый, я вот уже несколько часов в поисках по интернету... не могу найти, что же значит это "Член класса с модификатором доступа internal доступен для всех классов внутри одной сборки". Не могли бы Вы пояснить, мне несведующему? Добавлено через 1 минуту и 18 секунд Объекты базы данных. |
| Автор: azesmcar 13.8.2009, 20:39 | ||||||||
Ты же сам писал.
а что такое сборка - я ответил ссылкой, ты ведь не лекции по C# здесь ожидаешь увидеть? Вот, немного процитирую
http://msdn.microsoft.com/en-us/library/7c5ka91b%28VS.80%29.aspx что такое сборка (assembly)
http://msdn.microsoft.com/en-us/library/ms173099%28VS.80%29.aspx Например, ты можешь написать DLL, в классах этой DLL использовать спецификатор доступа internal, он будет доступен всем методам в DLL, но пользователь библиотеки не будет иметь доступ к ней. Есть еще protected internal, почитай в MSDN. |
| Автор: Skynin 13.8.2009, 21:12 | ||||||
Можно, только руками, не на уровне синтаксиса:
Малополезная вещь при грамотном проектировании. Решение "в лоб" - выше. |
| Автор: PashaPash 13.8.2009, 21:34 | ||||
Skynin, решение влоб ломается вот так
Да и хочется же проверки на уровне синтаксиса. bvn13, вообще сама идея выставлять переменную из другого класса - это как-то не комильфо. Вариант - интерфейс с read only проперти. Что-то типа
|
| Автор: nerezus 13.8.2009, 22:13 | ||
|
| Автор: Bestoloch 14.8.2009, 10:20 |
| На сколько я понимаю абстрагирование слоев это best practice. В данном случае есть слой работы с базой данных, в работу которого должен вмешаться класс из другого слоя, зачем? |
| Автор: Skynin 14.8.2009, 10:28 | ||||||
В C# почти все ломается рефлексией. Так что теперь, и не жить? Задача то - избавиться от непреднамеренно некорректного использования метода присваивания. А не защита от "хакера". Если же нужно чтобы только один объект класса мог присвоить, ну так и сделать его синглтоном, и упрятать конструктор без параметров. Но если быть параноиком, то обсуждение этого плевого вопроса потянет не на одну страницу
тогда, проверка во время компиляции
где ClassB, ClassC, ClassD - дружественные к ClassA |
| Автор: PashaPash 14.8.2009, 13:03 | ||||
IMHO, Защита на уровне синтаксиса не должна ломаться на уровне синтаксиса. Защита на уровне кода не должна ломаться вписыванием не-рефлекш кода. Даже если это защита от дурака, а не от хакера. Любой дурак при попытке вызвать метод неоттуда впишет new ClassB, тупо проверить, а вдруг заработает - и ведь заработает Ну и в целом система с sender напоминает "скажи пароль - пароль - проходи"
Задача - избавится от непреднамеренно некорректного использования метода присваивания без дополнительных телодвижений со стороны используещего. sender - это уже ограничение - нельзя вызвать из статического класса/метода. И повышение coupling - в случае friend или интерфейса реализация ничего не знает о классе-пользователе, в случае sender - знает более чем достаточно. и даже может вызвать в нем что-нибудь - снаружи ж не видно. Для таких случаев есть Interface-Segregation Principle. |
| Автор: ДобренькийПапаша 14.8.2009, 14:22 | ||
Так и не проще ли воспользоваться свойствами? |