![]() |
Модераторы: 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. Ещё вопросы ? ![]() -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |