Частичные классы и методы
В этой статье я собираюсь объяснить, что такое частичные классы и частичные методы, и как их реализовать на C #.
В C # идентификатор, используемый для идентификации класса, должен быть уникальным; однако при работе над крупномасштабными проектами может потребоваться, чтобы несколько разработчиков работали над одним и тем же классом или методами одновременно. По этой причине Microsoft представила частичное ключевое слово и добавила эту новую функцию в C # 2.0.
Ключевое слово partial позволяет разделить определение класса на разные части в одном пространстве имен, которые будут объединены при компиляции приложения.
Чтобы использовать эту функцию, каждая часть должна:
- Используйте ключевое слово частичное.
- Будьте доступны во время компиляции.
- Иметь одинаковый модификатор доступа (открытый, закрытый, защищенный и внутренний).
- Находиться в том же пространстве имен, что и другие части.
Также важно отметить, что:
- Если хотя бы одна часть объявлена абстрактной, то весь тип считается абстрактным.
- Если хотя бы одна часть объявлена запечатанной, то весь тип считается запломбированным.
- Если хотя бы одна часть объявляет базовый тип, то весь тип наследует этот класс (даже части, в которых не указан базовый класс, по-прежнему наследуют базовый тип).
- Любые члены класса, структуры или интерфейса, объявленные в одной части, доступны всем остальным частям.
Например, если мы рассмотрим следующие части:
PartialClassFirstFile.cs
partial class Earth : Planet, IRotate { public void CalcolateMass() { … } }
PartialClassSecondFile.cs
partial class Earth : IRevolve { public void CalcolateSpeed() { … } }
После завершения компиляции эквивалентный класс:
class Earth : Planet, IRotate, IRevolve { public void CalcolateMass() { … } public void CalcolateSpeed() { … } }
Ключевое слово partial также можно применять к методам. Его поведение очень похоже на поведение классов, фактически, класс может содержать сигнатуру метода, а другая часть может предоставлять его реализацию. Обе части будут объединены во время компиляции.
Если реализация не предоставлена, компилятор оптимизирует код, удалив и метод, и все вызовы во время компиляции.
Важно упомянуть этот частичный метод:
- должен возвращать void.
- могут иметь параметры in или ref, но не out (должны быть назначены параметры out, а поскольку частичный метод может быть не реализовано, использование таких параметров не допускается).
- являются неявно частными (следовательно, не могут быть виртуальными).
- могут иметь статические и небезопасные модификаторы.
- могут быть дженериками.
В следующем примере мы добавим немного больше кода к предыдущему коду.
PartialClassFirstFile.cs
partial class Earth : Planet, IRotate { public void CalcolateMass() { … } public partial void CalcolateVolume() { } public partial void CalcolateForce() { } }
PartialClassSecondFile.cs
partial class Earth : IRevolve { public void CalcolateSpeed() { … } public partial void CalcolateVolume() { … } }
В этом случае класс Earth, реализованный в файле PartialClassFisrtFile.cs, объявляет только сигнатуру метода как CalcolateVolume, так и CalcolateForce. Хотя метод CalcolateVolume реализован в относительном классе в файле PartialClassSecondFile.cs, другой метод - нет, что означает, что после завершения компиляции метод CalcolateForce будет удален, а последний класс будет :
class Earth : Planet, IRotate, IRevolve { public void CalcolateMass() { … } public void CalcolateVolume() { … } public void CalcolateSpeed() { … } }