Страница 336 из 502
<b>partial тип имя_типа {//...</b>
где имя_типа обозначает имя класса, структуры или интерфейса, разделяемого на части. Каждая часть получающегося частичного типа должна указываться вместе с модификатором partial.
Рассмотрим пример разделения простого класса, содержащего координаты ХУ, на три отдельных файла. Ниже приведено содержимое первого файла.
<b>partial class XY {</b>
<b> public XY(int a, int b) {</b>
<b> X = a;</b>
<b> Y = b;</b>
<b> }</b>
<b>}</b>
Далее следует содержимое второго файла.
<b>partial class XY {</b>
<b> public int X { get; set; }</b>
<b>}</b>
И наконец, содержимое третьего файла.
<b>partial class XY {</b>
<b> public int Y { get; set; }</b>
<b>}</b>
В приведенном ниже файле исходного текста программы демонстрируется применение класса XY.
<b>// Продемонстрировать определения частичного класса.</b>
<b>using System;</b>
<b>class Test {</b>
<b> static void Main() {</b>
<b> XY xy = new XY(1, 2);</b>
<b> Console.WriteLine(xy.X + "," + xy.Y);</b>
<b> }</b>
<b>}</b>
Для того чтобы воспользоваться классом XY, необходимо включить в компиляцию все его файлы. Так, если файлы класса XY называются xy1.cs, ху2.cs и хуЗ.cs, а класс Test содержится в файле test.cs, то для его компиляции достаточно ввести в командной строке следующее.
<b>csc test.cs xyl.cs xy2.cs xy3.cs</b>
И последнее замечание: в C# допускаются частичные обобщенные классы. Но параметры типа в объявлении каждого такого класса должны совпадать с теми, что указываются в остальных его частях.
Частичные методы
Как пояснялось в предыдущем разделе, с помощью модификатора partial можно создать класс частичного типа. Начиная с версии 3.0, в C# появилась возможность использовать этот модификатор и для создания частичного метода в элементе данных частичного типа. Частичный метод объявляется в одной его части, а реализуется в другой. Следовательно, с помощью модификатора partial можно отделить объявление метода от его реализации в частичном классе или структуре.
Главная особенность частичного метода заключается в том, что его реализация не требуется! Если частичный метод не реализуется в другой части класса или структуры, то все его вызовы молча игнорируются. Это дает возможность определить, но не востребовать дополнительные, хотя и не обязательные функции класса. Если эти функции не реализованы, то они просто игнорируются.
Ниже приведена расширенная версия предыдущей программы, в которой создается частичный метод Show(). Этот метод вызывается другим методом, ShowXY(). Ради удобства все части класса XY представлены в одном файле, но они могут быть распределены по отдельным файлам, как было показано в предыдущем разделе.
<b>// Продемонстрировать применение частичного метода.</b>
<b>using System;</b>
<b>partial class XY {</b>
<b> public XY(int a, int b) {</b>
<b> X = a;</b>
<b> Y = b;</b>
<b> }</b>
<b> // Объявить частичный метод,</b>
<b> partial void Show();</b>
<b>}</b>
<b>partial class XY {</b>
<b> public int X { get; set; }</b>
<b> // Реализовать частичный метод,</b>
<b> partial void Show() {</b>
<b> Console.WriteLine("{0}, {1}", X, Y);</b>
<b> }</b>
<b>}</b>
<b>partial class XY {</b>
<b> public int Y { get; set; }</b>
<b> // Вызвать частичный метод,</b>
<b> public void ShowXY() {</b>
<b> Show();</b>
<b> }</b>
<b>}</b>
<b>class Test {</b>
<b> static void Main() {</b>
<b> XY xy = new XY(1, 2);</b>
<b> xy.ShowXY();</b>
<b> }</b>
<b>}</b>
Обратите внимание на то, что метод Show() объявляется в одной части класса XY, а реализуется в другой его части. В реализации этого метода выводятся значения координат X и Y. Это означает, что когда метод Show() вызывается из метода ShowXY(), то данный вызов действительно имеет конкретные последствия: вывод значений координат X и Y. Но если закомментировать реализацию метода Show(), то его вызов из метода ShowXY() ни к чему не приведет.