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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дружественные методы и классы в C# 
:(
    Опции темы
CyraxZ
Дата 22.2.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть ли аналоги дружественных методов и классов в C# ?

Необходимо получить доступ к private-полю и к private-методу класса из другого класса...

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


Шустрый
*


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

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



я думаю нет, в сишарпе все строго
PM MAIL   Вверх
CyraxZ
Дата 22.2.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда какие варианты ?
PM MAIL   Вверх
Idsa
Дата 22.2.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Дык какие могут быть варианты?! Private-члены на то и private, чтобы они были доступны только внутри объекта.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
CyraxZ
Дата 22.2.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вот, скажем, ситуация такая. Объект класса Element может создаваться прикладным пользователем в своей программе. В то же время имеется объект SChart, который так же может создаваться и юзаться пользователем в своих программах.
Некоторый метод класса Element не может быть вызван прикладным пользователем по причине отсутствия в этом необходимости (этот метод используется другими public-методами этого же класса). Вполне резонно объявить этот метод как private.
В то же время объект класса SChart должен иметь доступ к этому private-методу класса Element. Если в этом случае мы откроем доступ (сделаем метод класса Element открытым), то тем самым мы его откроем его и для прикладного пользователя, который будет юзать как Element, так и SChart...
Как разрешить эту проблему в данном случае ?

Добавлено @ 21:17 
Idsa, праdила без исключений довольно редки, по крайней мере для C++...
PM MAIL   Вверх
Idsa
Дата 22.2.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(CyraxZ @  22.2.2007,  21:15 Найти цитируемый пост)
Idsa, праdила без исключений довольно редки, по крайней мере для C++...

Так за то люди и любят C#, что в нем все четко и логично  smile

Несмотря на то, что придуманная тобой ситуация немного надуманна, попробуем ее реализовать. Дружественные методы можно реализовать по-разному... я лишь предложу один вариант:
Код

  class Element
  {
    public Element()
    {
    }

    public void CallFriendlyMethod(object obj)
    {
      if (obj is SChart)
        FriendlyMethod();
      else
        Console.WriteLine("Нифига подобного :) !");
    }

    private void FriendlyMethod()
    {
      Console.WriteLine("Вот мы и вызвали дружественный метод");
    }
  }

  class SChart
  {
    public SChart()
    {
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Element element = new Element();
      SChart sChart = new SChart();
      element.CallFriendlyMethod(sChart);
      element.CallFriendlyMethod(element);
      Console.ReadLine();
    }
  }

Так пойдет?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Sartorius
Дата 22.2.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



делайте метод публичным и не парьтесь. Что мешает пользователю вызвать этот "приватный" метод, передав объект SChar в примере Idsa? Там он как раз пользователем и вызывается, а не классом .
ИМХО без дружественных классов методу довольно трудно , если возможно вообще , определить кто его вызвал.
ЗЫ могу предложить такой прием(раз уж начали извращаться). Вызываемому методу передается константа, которую знаеть лишь класс SChar, а от пользователя она скрыта. 

Это сообщение отредактировал(а) Sartorius - 22.2.2007, 22:04
PM MAIL ICQ   Вверх
CyraxZ
Дата 22.2.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Так за то люди и любят C#, что в нем все четко и логично...

...что достигается неизбежным снижением гибкости языка...

Цитата

придуманная тобой ситуация немного надуманна

Реальная ситуация из реального проекта...

Цитата

Так пойдет?

Нет. Если уж как-то извращаться, то так, чтобы пользователя класса Element это не коснулось, т.е. для рядового пользователя класса Element метод должен быть закрытым (а не открытым, но с дополнительным параметром)...
PM MAIL   Вверх
Idsa
Дата 22.2.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(CyraxZ @  22.2.2007,  22:06 Найти цитируемый пост)
 Если уж как-то извращаться, то так, чтобы пользователя класса Element это не коснулось, т.е. для рядового пользователя класса Element метод должен быть закрытым (а не открытым, но с дополнительным параметром)...

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


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
CyraxZ
Дата 22.2.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спросим у Sartorius'а... 
PM MAIL   Вверх
Sartorius
Дата 22.2.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



CyraxZ, а чего я? я ничего...  smile  у меня кроме варианта с уникальной константой идей нет... 
Ну или сделать его protected и отнаследоваться от Element. 
PM MAIL ICQ   Вверх
CyraxZ
Дата 22.2.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пока вопрос оставим открытым...
PM MAIL   Вверх
mr.DUDA
Дата 23.2.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Решается использованием internal модификатора для мемберов (полей, свойств, методов) - в своей сборке такой мембер будет виден откуда угодно, а в прикладном коде (который по идее лежит в другой сборке) мембер недоступен. Потому как internal. Если нужно чтобы мембер был доступен в классах-наследниках, юзаем protected internal.


--------------------
user posted image
PM MAIL WWW   Вверх
Idsa
Дата 23.2.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



mr.DUDA, перечитай внимательно пост CyraxZ: нужно сделать все наоборот!


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 23.2.2007, 10:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Idsa, читаю:

Цитата(CyraxZ @  22.2.2007,  19:48 Найти цитируемый пост)
Есть ли аналоги дружественных методов и классов в C# ? Необходимо получить доступ к private-полю и к private-методу класса из другого класса...


Дружественные методы в C++ дают одному классу доступ к private-полям (методам) другого класса, используя ключевое слово friend. Теперь вернёмся к нашим баранам (C#): класс не может работать с private-полями другого класса, за исключением случаев когда поле объявлено с модификатором internal. Развиваю тему: теперь нужно решить задачу, как "скрыть" приватное поле от прикладного кода ? Так: прикладной код и наш код (оба класса - с полем, и тот кому оно нужно) разносятся по разным dll/exe. Так обычно и поступают, делают общуюю длл-ку, которую подключают к приложению по reference.

Ещё вопросы ?  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Idsa
Дата 23.2.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ааа, ну теперь понятно. Геморойчик, конечно... но работает smile.
А как эту фишку реализовали в C++?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 23.2.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(Idsa @  23.2.2007,  10:15 Найти цитируемый пост)
А как эту фишку реализовали в C++?

В синтаксисе С++ выделено ключевое слово friend, используется так:

Код
class A
{
      int x; // приватное поле
};

// ...

class B
{
   friend class A; // дружим с классом

   void Method(A obj)
   {
        obj.x++;
   }
};



--------------------
user posted image
PM MAIL WWW   Вверх
Idsa
Дата 23.2.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я спросил, не как эту фишку использовать, а как ее реализовали!


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 23.2.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Это же чисто синтаксическая конструкция, что тут непонятного. Или тебе интересно, как компилятор С++ обрабатывает friend ? 




--------------------
user posted image
PM MAIL WWW   Вверх
Idsa
Дата 23.2.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mr.DUDA @  23.2.2007,  13:56 Найти цитируемый пост)
Или тебе интересно, как компилятор С++ обрабатывает friend ? 

Именно!


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
CyraxZ
Дата 23.2.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Ещё вопросы

Ну раз уж просишь, щас придумаю...
PM MAIL   Вверх
mr.DUDA
Дата 23.2.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(CyraxZ @  23.2.2007,  13:25 Найти цитируемый пост)
Ну раз уж просишь, щас придумаю...

 smile 
это к Idsa было...


--------------------
user posted image
PM MAIL WWW   Вверх
CyraxZ
Дата 23.2.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mr.DUDA
Цитата

это к Idsa было...

Всё-равно придумаю... по сабжу...

PM MAIL   Вверх
Dray
Дата 24.2.2007, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Еще вареант. Сделать все методы пабликами. А чтоб у пользователя работающего с классами не возникала мысль эти методы вызвать, написать комментарий:
"Не тронь! Оторву руки!"
 smile 


--------------------
忍者

user posted image
PM MAIL   Вверх
Stepan_Lameroff
Дата 24.2.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Пространство имен System.Reflection содержит классы и интерфейсы, обеспечивающие управляемое представление загруженных типов, методов и полей с возможностью динамического создания и вызова типов.

Код

Assembly assm = Assembly.LoadFrom("assm.dll");
Type[] types = assm.GetTypes();

foreach (Type t in types)
{
    //ВСЕ поля
    FieldInfo[] fields = t.GetFields(~ new BindingFlags());

    //ВСЕ методы
    MethodInfo[] methods = t.GetMethods(~ new BindingFlags());
    ...
   //ну и так далее
}


 

PM MAIL   Вверх
Любитель
Дата 25.2.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(Idsa @ 23.2.2007,  14:01)
Цитата(mr.DUDA @  23.2.2007,  13:56 Найти цитируемый пост)
Или тебе интересно, как компилятор С++ обрабатывает friend ? 

Именно!

Всмысле? Просто для дружественной функции или всех методов дружественного класса считает нормой доступ к прайват/протектед полям. В нэтив коде нет никаких ВМ, которые нагло следят как бы вы не тронули что-то куда лезть нельзя, вся защита доступа идёт онли на уровне компилера. Если он сказал можно - значит можно. Что такое доступ к полю? Тривиальное обращение к обычной переменной, по адресу objAddress + fieldOffset. Можно написать и что-то такое:
Код

class ClassWithPrivate
{
private:
    int i;
public:
    ClassWithPrivate() {}
};

class HackedClass
{
public:
    int i;
};

int main()
{
   ClassWithPrivate obj; // создаём объект
   (reinterpret_cast<HackedClass*>(&obj))->i = 5; // доступ к прайват полю
}


Это сообщение отредактировал(а) Любитель - 25.2.2007, 16:25


--------------------
PM MAIL ICQ Skype   Вверх
pavel78
Дата 7.11.2012, 17:22 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Напишите программу, которая находит среднюю цифру в записи натурального 
числа, если в числе нечетное количество цифр. Вывести результат и 
комментарий. (через метод)
за ранее спасибо.
PM MAIL   Вверх
Экскалупатор
Дата 7.11.2012, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



pavel78, это ж надо было найти тему пятилетней давности что бы написать сюда не по теме и вообще не понятно к чему...

з.ы. с такими вопросами в раздел фриланса надо.

Это сообщение отредактировал(а) Экскалупатор - 7.11.2012, 23:58
PM MAIL ICQ   Вверх
AVX
Дата 9.11.2012, 05:02 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Напишите программу, которая делает запрос «введите число 1 или 2», и в зависимости от введенного числа выводит на экране «четное» или «нечетное».
за ранее спасибо. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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