- •Классы и структуры
- •Функции-члены
- •Передача параметров в методы
- •Параметры ref
- •Параметры out
- •Свойства
- •Свойства, доступные только для чтения и только для записи
- •Модификаторы доступа для свойств
- •Автоматически реализуемые свойства
- •Замечание о встраивании
- •Индексаторы
- •Тип_элемента this[int индекс]
- •Листинг 1.
- •Листинг 2.
- •Листинг 3.
- •Листинг 4.
- •Конструкторы
- •Статические конструкторы
- •Вызов одних конструкторов из других
- •Поля readonly
- •Анонимные типы
- •Структуры
- •Структуры это типы значений
- •Структуры и наследование
- •Конструкторы структур
- •Частичные классы
- •Статические классы
- •Класс Object
- •Методы System.Object
- •Метод ToString()
- •Расширяющие методы
Расширяющие методы
Существует множество способов расширить класс. При наличии исходного кода класса наследование, описанное в разделе 6.4, будет отличным способом добавления функциональности к объектам. Но что, если исходный код недоступен? Расширяющие методы позволяют изменять класс, не имея его исходного кода.
Расширяющие методы (extension method) это статические методы, которые могут стать частью класса, когда исходный код этого класса не доступен. Предположим, что классу Money из предыдущего примера понадобился метод AddToAmount (decimal amountToAdd). Однако по какой-то причине первоначальный исходный код сборки не может быть изменен непосредственно. Все, что остается это создать статический класс и добавить в него статический метод AddToAmount. Вот как должен выглядеть этот код:
namespace Wrox
{
public static class MoneyExtension
{
public static void AddToAmount(this Money money,
decimal amountToAdd)
{
money.Amount += amountToAdd;
}
}
}
Следует обратить внимание на параметры метода AddToAmount. Для расширяющего метода первым параметром всегда должен быть тип, который подлежит расширению, предваренный ключевым словом this. Это сообщит компилятору, что данный метод должен стать частью типа Money. В приведенном примере Money является расширяемым типом. В расширяющем методе можно обращаться к общедоступным методам и свойствам расширяемого типа.
В главной программе метод AddToAmount выглядит как еще один метод типа Money. Первый параметр не появляется, и ничего делать с ним не нужно. Новый метод вызывается подобно любому другому методу:
сash1.AddToAmount (10М);
Несмотря на то что расширяющий метод является статическим, можно использовать стандартный синтаксис метода экземпляра. Обратите внимание, что мы вызываем AddToAmount на переменной-экземпляре cash1, не указывая имя типа.
Если имя расширяющего метода совпадет с именем уже существующего метода класса, то расширяющий метод никогда не будет вызван. Любые методы экземпляра, имеющиеся в классе, имеют преимущество.
Итоги
В настоящей главе был представлен синтаксис создания и манипулирования объектами в С#. Вы увидели, как объявлять статические члены и члены уровня экземпляров, включая поля, свойства, методы и конструкторы. Кроме того, было показано, что в С# добавляется ряд новых средств, не предусмотренных в классической модели объектно-ориентированного программирования и в некоторых других языках: статические конструкторы, предоставляющие возможность инициализации статических полей, а также структуры, которые позволяют определять высокопроизводительные типы, хоть и предлагающие более ограниченный набор средств, зато не требующие использования управляемой кучи. Вы также узнали о том, что все типы С# изначально наследуются от System.Object, а это означает, что все типы имеют базовый набор полезных методов, включая ToString().