Используйте метод, который возвращает делегат авторизованным вызывающим объектам. Как?

Я изучаю С#. В книге есть вопрос (экзамен № 70-483), который для меня не имеет большого смысла, потому что я нигде не могу найти ни одного примера. Я понимаю это с точки зрения устранения неправильных ответов, а правильный ответ должен быть.

  1. У вас есть закрытый метод в вашем классе, и вы хотите сделать возможным вызов метода определенными вызывающими объектами. Что вы делаете?

А. Сделайте метод общедоступным.

B. Используйте событие, чтобы внешние пользователи могли быть уведомлены о выполнении метода.

C. Используйте метод, который возвращает делегат авторизованным вызывающим объектам.

D. Объявите закрытый метод как лямбду.

Правильный ответ «C»: «Метод может видеть, авторизован ли вызывающий, а затем возвращать делегата частному методу, который может быть вызван по желанию».

Что является примером этого? Что они подразумевают под авторизованным абонентом? В книге нет упоминания об авторизованном вызывающем абоненте. Единственное, что я смог найти об авторизации делегатов и методов, было о WCF и авторизации, но это наверняка выходит за рамки этого. Хорошо. Я надеюсь, что кто-то может пролить свет на это! Таких сложных вопросов очень много... если не сложных вопросов, то трудных для понимания ответов.


person MakerOfTheUnicake    schedule 23.10.2015    source источник


Ответы (2)


Вот пример того, как можно реализовать ответ C.

class Conspirator
{
    private void SecretMethod()
    {
        Console.WriteLine("Secret exposed!");
    }

    public Action GetSecretMethod(long authorizationKey)
    {
        if (authorizationKey == 63278823982)
        {
            return this.SecretMethod;
        }

        return null;
    }
}

Как видите, SecretMethod является частным. GetSecretMethod возвращает делегата, содержащего ссылку на приватный метод, но только если переданный authorizationKey правильный. Конечно, это очень простая форма «авторизации», и в реальной жизни у вас будет какой-то другой механизм авторизации.

Вы используете этот класс следующим образом:

void Main()
{
    var conspirator = new Conspirator();

    var secretPrinter = conspirator.GetSecretMethod(63278823982);
    secretPrinter();
    // Prints "Secret exposed!"
}
person Shedal    schedule 23.10.2015
comment
ОП уже знает, что это правильный ответ, и просит вас объяснить ему, почему. - person user3596113; 23.10.2015

Ответы действительно расплывчаты, а «правильный» ответ не имеет смысла с точки зрения архитектуры. «Авторизованный вызывающий абонент» не имеет смысла без контекста. Но мы можем подойти к этому методом исключения.

  1. Сделать метод общедоступным

Это позволяет всем называть это, так что это неправильно.

  1. Используйте событие, чтобы внешние пользователи могли быть уведомлены о выполнении метода.

Это не имеет ничего общего с вызовом метода, это просто отвлечение ответа. Неправильный

  1. Используйте метод, который возвращает делегат авторизованным вызывающим объектам.

Если мы предположим, что «авторизованные абоненты» означают «определенных абонентов», то это возможно.

  1. Объявите частный метод как лямбда.

Это часть того, что вы должны сделать, чтобы ограничить доступ к методу, но на самом деле ничего не делает. Значит, это не решает проблему.

Итак, № 3 (или C) правильный. Это действительно плохой вопрос, и на него нет четкого ответа. «Ответ» по сути такой же, как и вопрос, без дополнительных деталей.

Что касается вашего вопроса об «авторизованном вызывающем абоненте», он не указан (это проблема, с которой я столкнулся и с этим вопросом). Вы ничего не можете исследовать, кроме как принять ответ дословно (не в техническом смысле). Как я уже сказал, ответ по сути такой же, как и вопрос, который на самом деле не является ответом. Я бы приравнял это к «Что такое 1 + 1? Ответ: 1 + 1».

person Rob    schedule 23.10.2015
comment
Меня интересует четвертый ответ. Каким образом объявление метода как лямбда сделает его более ограниченным? Заявив мне, значит, int i = 2; И для метода: Method(){} Я не понимаю, как это может быть... объявлено как лямбда. - person MakerOfTheUnicake; 23.10.2015
comment
Объявление метода лямбдой, по сути, означает написание этого: private Func<int> myMethod = () => { return 1; }, что похоже на написание метода, но не совсем. Но по сути, это не решает ни одной из поставленных проблем (но было бы первым шагом к правильному ответу). - person Rob; 23.10.2015