![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Есть ли аналоги дружественных методов и классов в C# ?
Необходимо получить доступ к private-полю и к private-методу класса из другого класса... |
|||
|
||||
| ckopn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 20.3.2006 Репутация: нет Всего: нет |
я думаю нет, в сишарпе все строго
|
|||
|
||||
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Тогда какие варианты ?
|
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Дык какие могут быть варианты?! Private-члены на то и private, чтобы они были доступны только внутри объекта.
|
|||
|
||||
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Ну вот, скажем, ситуация такая. Объект класса Element может создаваться прикладным пользователем в своей программе. В то же время имеется объект SChart, который так же может создаваться и юзаться пользователем в своих программах.
Некоторый метод класса Element не может быть вызван прикладным пользователем по причине отсутствия в этом необходимости (этот метод используется другими public-методами этого же класса). Вполне резонно объявить этот метод как private. В то же время объект класса SChart должен иметь доступ к этому private-методу класса Element. Если в этом случае мы откроем доступ (сделаем метод класса Element открытым), то тем самым мы его откроем его и для прикладного пользователя, который будет юзать как Element, так и SChart... Как разрешить эту проблему в данном случае ? Добавлено @ 21:17 Idsa, праdила без исключений довольно редки, по крайней мере для C++... |
|||
|
||||
| Idsa |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Так за то люди и любят C#, что в нем все четко и логично Несмотря на то, что придуманная тобой ситуация немного надуманна, попробуем ее реализовать. Дружественные методы можно реализовать по-разному... я лишь предложу один вариант:
Так пойдет? |
||||
|
|||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
делайте метод публичным и не парьтесь. Что мешает пользователю вызвать этот "приватный" метод, передав объект SChar в примере Idsa? Там он как раз пользователем и вызывается, а не классом .
ИМХО без дружественных классов методу довольно трудно , если возможно вообще , определить кто его вызвал. ЗЫ могу предложить такой прием(раз уж начали извращаться). Вызываемому методу передается константа, которую знаеть лишь класс SChar, а от пользователя она скрыта. Это сообщение отредактировал(а) Sartorius - 22.2.2007, 22:04 |
|||
|
||||
| CyraxZ |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
...что достигается неизбежным снижением гибкости языка...
Реальная ситуация из реального проекта...
Нет. Если уж как-то извращаться, то так, чтобы пользователя класса Element это не коснулось, т.е. для рядового пользователя класса Element метод должен быть закрытым (а не открытым, но с дополнительным параметром)... |
||||||
|
|||||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
С критикой согласен, но я не представляю, как можно реализовать закрытый метод, но при этом доступный из другого класса. |
|||
|
||||
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Спросим у Sartorius'а...
|
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
CyraxZ, а чего я? я ничего...
Ну или сделать его protected и отнаследоваться от Element. |
|||
|
||||
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Пока вопрос оставим открытым...
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Решается использованием internal модификатора для мемберов (полей, свойств, методов) - в своей сборке такой мембер будет виден откуда угодно, а в прикладном коде (который по идее лежит в другой сборке) мембер недоступен. Потому как internal. Если нужно чтобы мембер был доступен в классах-наследниках, юзаем protected internal.
-------------------- ![]() |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
mr.DUDA, перечитай внимательно пост CyraxZ: нужно сделать все наоборот!
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Idsa, читаю:
Дружественные методы в C++ дают одному классу доступ к private-полям (методам) другого класса, используя ключевое слово friend. Теперь вернёмся к нашим баранам (C#): класс не может работать с private-полями другого класса, за исключением случаев когда поле объявлено с модификатором internal. Развиваю тему: теперь нужно решить задачу, как "скрыть" приватное поле от прикладного кода ? Так: прикладной код и наш код (оба класса - с полем, и тот кому оно нужно) разносятся по разным dll/exe. Так обычно и поступают, делают общуюю длл-ку, которую подключают к приложению по reference. Ещё вопросы ? -------------------- ![]() |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Ааа, ну теперь понятно. Геморойчик, конечно... но работает
А как эту фишку реализовали в C++? |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
В синтаксисе С++ выделено ключевое слово friend, используется так:
-------------------- ![]() |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Я спросил, не как эту фишку использовать, а как ее реализовали!
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Это же чисто синтаксическая конструкция, что тут непонятного. Или тебе интересно, как компилятор С++ обрабатывает friend ?
-------------------- ![]() |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Именно! |
|||
|
||||
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
Ну раз уж просишь, щас придумаю... |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
-------------------- ![]() |
|||
|
||||
| CyraxZ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 10.12.2006 Репутация: нет Всего: нет |
mr.DUDA
Всё-равно придумаю... по сабжу... |
|||
|
||||
| Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: нет Всего: 6 |
Еще вареант. Сделать все методы пабликами. А чтоб у пользователя работающего с классами не возникала мысль эти методы вызвать, написать комментарий:
"Не тронь! Оторву руки!" |
|||
|
||||
| Stepan_Lameroff |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 16.12.2006 Репутация: 9 Всего: 14 |
Пространство имен System.Reflection содержит классы и интерфейсы, обеспечивающие управляемое представление загруженных типов, методов и полей с возможностью динамического создания и вызова типов.
|
|||
|
||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Всмысле? Просто для дружественной функции или всех методов дружественного класса считает нормой доступ к прайват/протектед полям. В нэтив коде нет никаких ВМ, которые нагло следят как бы вы не тронули что-то куда лезть нельзя, вся защита доступа идёт онли на уровне компилера. Если он сказал можно - значит можно. Что такое доступ к полю? Тривиальное обращение к обычной переменной, по адресу objAddress + fieldOffset. Можно написать и что-то такое:
Это сообщение отредактировал(а) Любитель - 25.2.2007, 16:25 |
||||
|
|||||
| pavel78 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 7.11.2012 Репутация: нет Всего: нет |
Напишите программу, которая находит среднюю цифру в записи натурального
числа, если в числе нечетное количество цифр. Вывести результат и комментарий. (через метод) за ранее спасибо. |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
pavel78, это ж надо было найти тему пятилетней давности что бы написать сюда не по теме и вообще не понятно к чему...
з.ы. с такими вопросами в раздел фриланса надо. Это сообщение отредактировал(а) Экскалупатор - 7.11.2012, 23:58 |
|||
|
||||
| AVX |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.5.2010 Репутация: нет Всего: 1 |
Напишите программу, которая делает запрос «введите число 1 или 2», и в зависимости от введенного числа выводит на экране «четное» или «нечетное».
за ранее спасибо. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |