Подтвердить что ты не робот

Каковы различия между внешними, абстрактными и частичными для методов в абстрактном классе?

Я пишу абстрактный класс, потому что хочу предоставить несколько часто используемых методов, требующих нескольких методов, которые будут слишком специфичными, и позволяют некоторым методам "расширены". После столкновения с ошибкой компилятора мне интересно, может ли кто-нибудь объяснить различия между внешними, абстрактными и частичными ключевыми словами. Что они означают и когда/где я должен их использовать?

4b9b3361

Ответ 1

extern вряд ли будет чем-то, что вы хотите использовать. Это означает, что метод реализован, но реализован извне - и обычно используется в сценариях взаимодействия, где вы определяете метод, реализованный во внешнем коде.

абстрактный, с другой стороны, означает, что вы определяете API для метода, но не предоставляете реализацию. Подкласс должен обеспечивать реализацию для любых методов или свойств, помеченных как abstract, или сам быть abstract. Если вы хотите создать базовый класс и иметь метод или свойство, которые должны быть реализованы подклассами, вам следует использовать abstract.

Частичные классы и методы - всего лишь инструмент компиляции. Они позволяют вам использовать несколько файлов для определения вашего типа. Это в основном используется с автоматически сгенерированным кодом (то есть: дизайнер помещает сгенерированный дизайнером код в отдельный файл, определяющий частичный класс, так что вы можете "заполнить" недостающие фрагменты, не глядя на детали реализации). Это маловероятно, что вы будете использовать непосредственно для определения класса.

Ответ 2

Метод extern обычно реализуется через dll-import (P/Invoke), поэтому он имеет реализацию - вы просто не видите его.

A partial метод полезен, главным образом, с генерацией кода как способом ввода функциональности в сгенерированный код. Они являются необязательными, только частными, а - только, если вы предоставляете другую половину. Как таковые, существуют также некоторые ограничения по значениям возврата/выхода для обеспечения определенного назначения. Вызовы для частичных методов будут полностью исключены компилятором, если нет реализации.

Метод abstract - это то, где реализация должна предоставляться производным типом. Время выполнения гарантирует, что вы не можете иметь экземпляр, если все еще не реализованы абстрактные методы, поэтому вы уверены, что они будут существовать во время выполнения.

Ответ 3

Extern позволит вам использовать методы через dll-import, и этим вы придаете особое значение этому методу, что он поступает из внешних источников

Частичный:

  • Частичный метод должен быть объявлен в частичном классе или частичном struct
  • У вас не может быть модификатор доступа на Partial Method.
  • Частичный метод не может иметь модификаторы доступа или модификаторы виртуального, абстрактного, переопределяющего, нового, закрытого или внешнего.
  • Частичный метод не может иметь свою реализацию перед отдельным объявлением.
  • Частичный метод может быть определен и не может быть объявлен в том же частичном классе.

* Самая важная разница между методом Partial и Abstract - Partial Реализация является необязательной, но реализация абстрактного метода является обязательной *

Абстрактные методы строго требуют реализации в не абстрактном производном классе

Основное использование абстрактных методов заключается в том, что они должны быть реализованы для использования класс, потому что эти методы помогают эффективно использовать этот класс

Ответ 4

Внешний: http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx

Ошибка в использовании абстрактного (С# Reference) и внешних модификаторов для изменения одного и того же члена. Использование модификатора extern означает, что метод реализуется вне кода С#, а использование абстрактного модификатора означает, что реализация метода не предоставляется в классе.

Аннотация: http://msdn.microsoft.com/en-us/library/sf985hc5%28v=vs.80%29.aspx

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

partial: http://msdn.microsoft.com/en-us/library/wbx7zzdd%28v=vs.80%29.aspx

Определения неполного типа позволяют разделить определение класса, структуры или интерфейса на несколько файлов.

Ответ 5

Кажется, здесь есть несколько хороших ответов, но я все равно написал бы, чтобы было яснее

внешний

Из спецификации С#

Когда объявление метода включает модификатор extern, этот метод называется внешним методом. Внешние методы реализуются извне, обычно с использованием языка, отличного от С#. Поскольку объявление внешнего метода не обеспечивает фактической реализации, тело метода внешнего метода просто состоит из точки с запятой. Внешний метод не может быть универсальным. Модификатор extern обычно используется вместе с атрибутом DllImport, что позволяет реализовывать внешние методы с помощью DLL (библиотеки динамических ссылок). Среда выполнения может поддерживать другие механизмы, посредством которых могут быть предоставлены реализации внешних методов. Когда внешний метод включает атрибут DllImport, объявление метода также должно включать статический модификатор. enter image description here

частичный

Частичный метод имеет свою сигнатуру, определенную в одной части частичного типа, и его реализацию, определенную в другой части типа. Частичные методы позволяют разработчикам классов предоставлять ловушки методов, аналогичные обработчикам событий, которые разработчики могут решить реализовать или нет. Если разработчик не предоставляет реализацию, компилятор удаляет подпись во время компиляции. Следующие условия применяются к частичным методам:

  • Подписи в обеих частях частичного типа должны совпадать.
  • Метод должен возвращать void.
  • Модификаторы доступа не допускаются. Частичные методы являются неявно частными.

В следующем примере показан частичный метод, определенный в двух частях частичного класса:

enter image description here

Аннотация

Используйте модификатор abstract в объявлении метода или свойства, чтобы указать, что метод или свойство не содержат реализацию.

Абстрактные методы имеют следующие особенности:

  • Абстрактный метод неявно является виртуальным методом.
  • Объявления абстрактных методов разрешены только в абстрактных классах
  • Поскольку объявление абстрактного метода не обеспечивает фактической реализации, нет тела метода; объявление метода просто заканчивается точкой с запятой, и после подписи нет фигурных скобок ({}).
  • Ошибочно использовать статические или виртуальные модификаторы в объявлении абстрактного метода.

В этом примере класс Square должен предоставлять реализацию Area, поскольку он наследуется от ShapesClass:

enter image description here

Источник

Надеюсь, что это помогает в лучшем понимании, счастливого кодирования!