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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода определенным классом, наверное по security 
:(
    Опции темы
StepS
  Дата 10.1.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем ! Есть класс (типа статический) у него есть конструктор или другой метод (не важно) который инициализирует этот класс. Так вот, задача в том чтобы этот метод могли вызывать только определенные классы, не наследники. Как такое можно сделать ? что-то мне подсказывает что это нужно решать с помощью атрибутов !
Кто-то такое уже делал ? или где можно про это почитать ? Ответы : "в МСДН", "МСДН рулит" и т.п. не в счет, смотрел - ничего не нашел или тогда прямую ссылку в МСДН-е.
smile
PM MAIL ICQ   Вверх
Void
Дата 10.1.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Как вариант, пометить метод internal и поместить этот класс с теми, которые должны иметь к нему доступ, в отдельную сборку.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Exception
Дата 10.1.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Методы класса может вызвать любой другой класс. Другое дело, ты можешь ограничить область видимости метода.
А если подобное приходится делать, приложение неверно спроектировано.
PM   Вверх
Дрон
Дата 10.1.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(Exception @ 10.1.2006, 19:25 Найти цитируемый пост)

А если подобное приходится делать, приложение неверно спроектировано.

Хех... Я плохо помню, но разве паттерн Хранитель (Memento) не на этом основан?
В С++ такое дело реализовывается при помощи модификатора friend, а вот в C# такого нет.

Это сообщение отредактировал(а) Дрон - 10.1.2006, 19:35


--------------------
Да. Именно так.
PM   Вверх
Exception
Дата 10.1.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Дрон @ 10.1.2006, 20:34 Найти цитируемый пост)

В С++ такое дело реализовывается при помощи модификатора friend

Нельзя ли примерчик посмотреть? Интересно smile
PM   Вверх
Дрон
Дата 10.1.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Ну, Мементо я не помню, найди в сети, но если просто так, то вот:
Код

class MyClass
{
    private:

    void PrivateMethod()
    {
        // bla-bla-bla     
    }

     // разрешаем доступ к закрытой части
     friend class AnotherClass;
}

class AnotherClass
{
     public:
     void Test()
     {
           MyClass obj;
           obj.PrivateMethod();
     }
}


Но этот механизм довольно примитивный и полностью разрушает инкапсуляцию.

Это сообщение отредактировал(а) Дрон - 10.1.2006, 19:55


--------------------
Да. Именно так.
PM   Вверх
mr.DUDA
Дата 10.1.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Дрон @ 10.1.2006, 18:55 Найти цитируемый пост)
Но этот механизм довольно примитивный и полностью разрушает инкапсуляцию.

Вот наверное поэтому его и нет в сишарпе smile


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


Эксперт
****


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

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



Хм. Но все равно прикольно. Было бы классно нечто вроде
Код
class MyClass
{
[AllowAccess(OutsideClass.GoodMethod)]
private granted void Bla(){}
[DenyAccess(OutsideClass.BadMethod)]
public granted void BigBla(){}
}

PM   Вверх
arilou
Дата 10.1.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


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

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



StepS
Мой способ - самый извращенный smile Воспользоваться классом StackTrace и анализировать его. Сам так делал, когда надо было определить, откуда идет вызов.


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


Java-ненавистник :)
****


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

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



arilou
Да, это решение. Но нужно учесть, что проверка происходит во время выполнения, а не компиляции (как в С++).

Цитата(mr.DUDA @ 10.1.2006, 21:27 Найти цитируемый пост)
Вот наверное поэтому его и нет в сишарпе

Возможно, хотя private метод всё равно можно вызвать через Reflection smile


--------------------
Да. Именно так.
PM   Вверх
StepS
Дата 11.1.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я в принципе согласен с exception что программа не правильно спроектирована, но пример с использованием атрибутов мне понравился. Было бы прикольно.
Спасибо за помощь всем
PM MAIL ICQ   Вверх
deviLoper
Дата 11.1.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот еще вариант: если по стуктуре у этого класса не предусмотренно потомков то можно придумать что-то вроде:
Код

    public class A
    {
        protected int method()
        {return 1;}          
    }
    public class B
    {
        private class C:A
        {
            public int method2()
            {
                return method()+1;
            }
        }
        public int method3()
        {
            C var=new C();
            return var.method2+10;
        }
    }

тогда во всех классах, где нужно использовать метод объявляется приват наследник базового класса и через него вызывается нужный метод.
PM MAIL   Вверх
StepS
Дата 12.1.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у этого класса предусмотрены потомки smile
Он реализует основной функционал, а вот инициализация должна вызываться единожды и определенным классом
я уже пересмотрел модель классов и изменил так чтоб избежать этого. Но из ответов почерпнул новое smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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