
- •Лекции по курсу "Технология программирования" (1-й семестр) Оглавление
- •Технология .Net Предыдущее состояние дел.
- •Главные компоненты платформы .Net (clr, cts и cls)
- •Общеязыковая среда выполнения (clr)
- •О бщая система типов и общеязыковые спецификации (cts и cls)
- •Библиотека базовых классов
- •Роль языка с#
- •Компоновочные блоки
- •Роль метаданных типов .Net
- •Роль манифеста компоновочного блока
- •Общая система типов.
- •Объектно-ориентированное программирование
- •Главные элементы объектно-ориентированного подхода
- •Дополнительные элементы ооп
- •Принципы объектно-ориентированного программирования.
- •Классы Инкапсуляция
- •Объект (экземпляр класса).
- •Ключевое слово this
- •Отношения между объектами.
- •Основные отличительные особенности класса
- •Спецификаторы доступа
- •Состав класса
- •Поля класса
- •Доступ к полям
- •Статические и экземплярные переменные
- •Методы (функции-члены класса)
- •Переменное число параметров метода
- •Статические методы
- •Конструкторы
- •Закрытые конструкторы или классы без экземпляров
- •Статические конструкторы.
- •Деструкторы
- •Абстрактные методы и классы.
- •Свойства
- •Индексаторы
- •Статические классы
- •Частичные классы
- •Рекомендации по программированию
- •Наследование Понятие наследования в программировании
- •Типы наследования
- •Наследование реализации
- •Определение наследующих классов
- •Уровень доступа protected и internal
- •Ссылка на объект базового класса
- •Протоклассы
- •Предотвращение наследования с помощью ключевого слова sealed.
- •Отношения между классами
- •Абстрактные классы.
- •Класс object
- •Функциональные замыкания
- •Разработка функциональных замыканий с помощью наследования
- •Разработка функциональных замыканий с помощью экземпляров класса
- •Заключение.
- •Полиморфизм
- •Полиморфизм наследующих классов.
- •Переопределение методов родительского класса. Раннее связывание.
- •Виртуальные методы и их переопределение.
- •Как вызывают виртуальные методы
- •Виртуальные функции и принцип полиморфизма
- •Перегрузка.
- •Перегруженные конструкторы
- •Рекомендации программисту.
Наследование реализации
Наследование реализации (классическое наследование) представляет собой такую форму многократного использования программных средств, при которой новые классы создаются путем поглощения данных и поведения уже существующего класса и добавления ему новых функциональных возможностей. Возможность многократного использования программных средств экономит время разработки. Она также поощряет использование проверенного программного обеспечения, что повышает вероятность эффективной реализации системы.
Основная идея классического наследования заключается в том, что новые классы могут использовать и увеличивать (наращивать) функциональные возможности своих базовых классов. В С# каждый класс может иметь не более одного базового класса. Написав и огладив код базового класса, можно, не изменяя его, только за счет наследования приспособить новый, порожденный класс для работы в новых ситуациях.
Класс в С# может иметь произвольное количество потомков и только одного предка. При создании класса, вместо написания абсолютно новых переменных и методов класса, программист может обозначить факт того, что новый класс должен наследовать данные и методы другого класса. Новый порожденный класс, к которому обычно добавляются уникальные переменные и методы, часто по размеру больше своего базового класса. Именно поэтому порожденный класс более специфичен, нежели его базовый класс. Обычно производный класс содержит данные и поведения, взятые у базового класса, и добавляет к ним новые.
При использовании наследования для создания нового класса из уже существующего новый класс наследует все элементы (переменные и методы) из существующего класса. Новый класс можно настроить под соответствие нужным требованиям путем включения дополнительных переменных и методов членов класса и путем подмены членов базового класса.
Каждый объект производного класса также
является и объектом своего базового
класса. Однако, объекты базового класса
не являются объектами их производного
класса. К примеру, все автомобили являются
транспортными средствами, но не все
транспортные средства являются
автомобилями.
Или другой пример. Например, прямоугольник - это четырехугольник (впрочем, как и квадраты, параллелограммы или трапеции). Следовательно, можно сказать, что класс Rectangle (прямоугольник) наследуется от класса Quadrilateral (четырехугольник). В данном контексте класс четырехугольника является базовым, а класс прямоугольника – производным. Прямоугольник представляет собой более специфический (конкретный) тип четырехугольника, но некорректно было бы говорить, что любой четырехугольник является прямоугольником. Потому что четырехугольник может быть еще и параллелограммом, трапецией, ромбом или еще чем-то, порожденным от класса четырехугольника. Отсюда следует, что набор объектов, представленный базовым классом, как правило, больше, чем набор объектов, представленных любым из его производных классов. Например, базовый класс "транспортное средство" представляет (описывает) все транспортные средства, включая легковые и грузовые автомобили, корабли, велосипеды и т.д.. Производный же класс "легковые автомобили" представляет собой только лишь небольшое множество транспортных средств.
Опыт создания программных систем указывает на то, что большая часть любого программного кода имеет весьма близкое отношение к конкретным объектам. Но, когда программисты чрезмерно увлекаются конкретизацией, то обилие подробностей может "затереть" общую картину. Другими словами, среди множества деталей необходимо стараться не потерять главного. Поэтому при объектно-ориентированном программировании разработчики делают упор, прежде всего, на общности объектов в системе, а не на их конкретных характеристиках. Этот процесс называется абстракцией или абстрагированием.
П
риведенные
примеры ясно показывают, что отношения
наследования могут образовывать
иерархические структуры, подобные
деревьям, в которых класс существует в
иерархическом взаимоотношении со своими
производными классами. Вообще говоря,
классы могут существовать и независимо
друг от друга. Но как только они вовлекаются
в наследование, то сразу становятся
"привязанными" к другим классам.
В результате класс становится либо
базовым, обеспечивающим другие классы
собственными данными и поведением, либо
производным классом, наследующим данные
и поведение от других классов.
Таким образом, наследование представляет собой механизм, когда общие (или наиболее общие) данные и методы берутся от базового класса, и в дополнение к ним добавляются и определяются НОВЫЕ свойства и методы. Поэтому, прежде всего, наследование реализует механизмы расширения базового класса.
Кроме того, наследование обеспечивает возможность многократного использования кода. Написав и огладив код базового класса, можно, не изменяя его и только за счет наследования приспособить класс для работы в различных ситуациях. Это экономит время разработки и повышает надежность программ. Классы, расположенные ближе к началу иерархии, объединяют в себе общие черты для всех нижележащих классов. По мере продвижения вниз по иерархии классы приобретают все больше конкретных особенностей.
Наследование применяется для достижения следующих взаимосвязанных целей:
исключения из программы повторяющихся фрагментов кода;
упрощения модификации программы;
упрощения создания новых программ на основе существующих.
Следует отметить еще и то обстоятельство, что наследование является, пожалуй, единственной возможностью использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения.