2015-09-13 3 views
0

Я думал о MulticastDelegate и Delegate, и я не понимаю, почему причина, вызывающая метод arent, является абстрактным методом MulticastDelegate. Кто-то знает?C# MulticastDelegate и Invoke Method

+0

Почему вы думаете, что это должен быть абстрактный метод? – Tim

+0

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

+0

Нет, метод Invoke() для каждого делегата отличается. Автоматически генерируемый компилятором из объявления делегата, он имеет те же аргументы. Поэтому вы никогда не можете назвать это неправильным. И это не может быть абстрактным. –

ответ

1

MulticastDelegate тип не имеет Invoke() способ (не BeginInvoke()). Эти методы автоматически предоставляются в фактическом delegate типах во время выполнения. Поэтому наиболее очевидной причиной для вопроса «почему не является метод Invoke() в MulticlassDelegate с пометкой abstract» является то, что такого метода нет.

Если вы спрашиваете, почему этот метод не находится в MulticlassDelegate (а затем помечен abstract), то я бы спросил вас: как это могло быть? Каждому типу делегата нужен свой собственный метод Invoke(), потому что подпись этого метода зависит конкретно от подписи типа делегата. Никакой базовый класс не может предоставить этот тип.

Наконец, отметим, что MulticlassDelegate типа является одним из нескольких «особых» типов в .NET, и явно предназначен не наследоваться кодом пользователя. Не он, ни какой-либо объявленный подкласс типа delegate. Поскольку наследование невозможно, на самом деле не имеет значения, является ли элемент abstract; это никого не принесло бы, даже если бы это было так.

От the documentation:

Класс Делегат является базовым классом для типов делегатов. Однако только система и компиляторы могут быть получены явно из класса Delegate или из класса MulticastDelegate. Также недопустимо выводить новый тип из типа делегата. Класс Delegate не считается типом делегата; это класс, используемый для получения типов делегатов.

Большинство языков реализует ключевое слово делегата, а компиляторы для этих языков могут быть получены из класса MulticastDelegate; поэтому пользователи должны использовать ключевое слово delegate, предоставленное языком.

  • Примечание:

    общеязыковой среде выполнения предоставляет метод Invoke для каждого типа делегата, с той же подписью, как делегат. Вам не нужно явно вызывать этот метод из C#, Visual Basic или Visual C++, потому что компиляторы автоматически его называют. Метод Invoke полезен при отражении, когда вы хотите найти подпись типа делегата.