
- •Лекции по курсу "Технология программирования" (1-й семестр) Оглавление
- •Технология .Net Предыдущее состояние дел.
- •Главные компоненты платформы .Net (clr, cts и cls)
- •Общеязыковая среда выполнения (clr)
- •О бщая система типов и общеязыковые спецификации (cts и cls)
- •Библиотека базовых классов
- •Роль языка с#
- •Компоновочные блоки
- •Роль метаданных типов .Net
- •Роль манифеста компоновочного блока
- •Общая система типов.
- •Объектно-ориентированное программирование
- •Главные элементы объектно-ориентированного подхода
- •Дополнительные элементы ооп
- •Принципы объектно-ориентированного программирования.
- •Классы Инкапсуляция
- •Объект (экземпляр класса).
- •Ключевое слово this
- •Отношения между объектами.
- •Основные отличительные особенности класса
- •Спецификаторы доступа
- •Состав класса
- •Поля класса
- •Доступ к полям
- •Статические и экземплярные переменные
- •Методы (функции-члены класса)
- •Переменное число параметров метода
- •Статические методы
- •Конструкторы
- •Закрытые конструкторы или классы без экземпляров
- •Статические конструкторы.
- •Деструкторы
- •Абстрактные методы и классы.
- •Свойства
- •Индексаторы
- •Статические классы
- •Частичные классы
- •Рекомендации по программированию
- •Наследование Понятие наследования в программировании
- •Типы наследования
- •Наследование реализации
- •Определение наследующих классов
- •Уровень доступа protected и internal
- •Ссылка на объект базового класса
- •Протоклассы
- •Предотвращение наследования с помощью ключевого слова sealed.
- •Отношения между классами
- •Абстрактные классы.
- •Класс object
- •Функциональные замыкания
- •Разработка функциональных замыканий с помощью наследования
- •Разработка функциональных замыканий с помощью экземпляров класса
- •Заключение.
- •Полиморфизм
- •Полиморфизм наследующих классов.
- •Переопределение методов родительского класса. Раннее связывание.
- •Виртуальные методы и их переопределение.
- •Как вызывают виртуальные методы
- •Виртуальные функции и принцип полиморфизма
- •Перегрузка.
- •Перегруженные конструкторы
- •Рекомендации программисту.
Перегрузка.
В объектно-ориентированном программировании перегрузкой называют практику придания функции более чем одного значения. Этот термин означает, что на один и тот же идентификатор нагружено несколько функций. Перегруженные функции уже не различимы по одному только идентификатору (он у них одинаковый).
В самом общем смысле перегрузка представляет собой дополнительный способ различать функции с одинаковыми названиями.
Почему следует использовать перегрузку.
В английском языке, как, очевидно, и во многих других языках, одни и те же глаголы, используемые в разных контекстах, означают разные действия. Рассмотрим глагол играть. Он используется в следующих ситуациях:
Играть на пианино
Играть в баскетбол
Играть с игрушкой
Играть на бирже
Говоря в терминах языка программирования, слово играть, используемое как глагол, перегружено. Каждый контекст имеет своё значение, но все случаи использования всё-таки концептуально связаны. Повторное использование одних и тех же глаголов, в разных, но схожих ситуациях не только обеспечивает важные подсказки в процессе мышления, но и сокращает количество слов, необходимых в языке.
В объектно-орентированном программировании простота очень важна. Чем меньше вы знаете о системе и её использовании, тем лучше. То же самое касается и программного кода. Чем меньше деталей нужно указать при вызове метода, тем лучше. Это позволяет компилятору варьировать вызовы методов и манипулировать объектами. Рассмотрим метод Display(), которая принимает и отображает аргумент на экране монитора. Например, можно написать так:
Display("\nНапечатай это, пожалуйста");
Display(123456789);
Display(3.14159);
Было бы прекрасно, если бы этот метод работал с любым аргументом, а всю дополнительную работу выполнял компилятор. В конце концов, компилятор видит типы всех аргументов, используемых в списке параметров, и должен уметь работать с этой информацией. С помощью перегрузки можно написать три метода так, что приведённый код будет работоспособен. Для этого каждый метод определяется отдельно от других и отличается от них количеством и типом принимаемых аргументов. В таких случаях говорят, что метод Display() перегружен, так как её идентификатор ассоциируется с более, чем одним методом.
Перегрузка придаёт языку программирования особую гибкость, предоставляя тем самым возможность пользователям писать программы с меньшими усилиями. Таким образом, перегрузка обеспечивает дружественность по отношению к программисту.
Но достоинства перегрузки не достаются даром, поскольку они повышают сложность компилятора, которому теперь приходится больше "думать". Проблема с перегруженными словами в языках программирования как, впрочем, и в естественных языках, подобных английскому, заключается в том, что семантика становится контекстно-зависимой. Другими словами, точное значение перегруженного идентификатора можно понять только после рассмотрения нескольких соседних слов. Для методов такими соседними словами являются количество и тип аргументов, используемых при вызове метода. Таким образом, перегрузка применима только к методам, но не к переменным, классам или типам.
Перегрузка методов.
Как уже говорилось, перегруженные функции используют один и тот же идентификатор, но различаются количеством и типом аргументов. При этом тип возвращаемого значения роли не играет. Таким образом, две функции void Display(int); и long Display(int); не различимы и приведут к ошибке компиляции. Перегруженные функции вовсе не обязательно должны быть членами класса. Можно перегружать как функции-члены, так и обычные функции.
Перегруженные методы.
Когда в классе объявляется несколько функций - членов с одним и тем же именем, то говорят, что имя функции в классе перегружено. Имя функции перегружено именно в классе, а не вообще. Другими словами, область видимости перегруженного имени - это всего один класс. Другие классы могут использовать то же имя, перегружая его иначе или не перегружая вообще. Разные классы - совершенно отдельные области видимости, и компилятор хранит их раздельно. Рассмотрим следующий код:
class Example
{
int value;
public:
public void Value(int v){ value=v; };
public void Value(){ return value; };
};
void main()
{
Example e;
e.Value(3);
int i = e.Value();
};
Класс Example имеет два перегруженных метода, один - для записи, а другой - для чтения переменной. Для перегруженных методов это обычное явление. Без применения механизма перегрузки пришлось бы использовать два отдельных метода, такие как PutValue() и GetValue(). Но язык С# позволяет это упростить. Перегруженные методы должны отличаться по одному или обоим описанным ниже пунктам:
методы должны иметь разное количество аргументов.
Отличие должно быть, по крайней мере, в одном из типов аргументов.
Как уже говорилось, тип возвращаемого значения не является фактором различия перегруженных методов.