Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники_АСОИ / Лекции / 01 Классы / Объекты и типы.docx
Скачиваний:
20
Добавлен:
29.02.2016
Размер:
97.14 Кб
Скачать

Расширяющие методы

Существует множество способов расширить класс. При наличии исходного кода класса наследование, описанное в разделе 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().

Соседние файлы в папке 01 Классы