Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_programmirovaniyu_3_semestr.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
2.11 Mб
Скачать

Заключение.

Эффективное использование классов позволяет усовершенствовать процесс разработки сложных систем и сократить время на их разработку, отладку и сопровождение. Язык С# стимулирует многократное использование программного кода предоставлением библиотеки классов .NET Framework (FCL), обладающей максимальными преимуществами повторного использования программных средств через наследования.

Наследование класса Y от класса X означает, что Y представляет собой разновидность класса X, то есть более конкретную, частную концепцию. Базовый класс Х является более общим понятием, чем Y. Везде, где можно использовать X, можно использовать и Y, но не наоборот (вспомните, что на место базового класса можно передавать любой из производных). Необходимо помнить, что во время выполнения программы не существует иерархии классов и передачи сообщений объектам базового класса из производных — есть только конкретные объекты классов, поля которых формируются на основе иерархии на этапе компиляции.

Главное преимущество наследования состоит в том, что на уровне базового класса можно написать универсальный код, с помощью которого можно работать также и с объектами производного класса, что реализуется с помощью виртуальных методов.

Как виртуальные должны быть описаны методы, которые выполняют во всех классах иерархии одну и ту же функцию, но, возможно, разными способами. Пусть, например, все объекты иерархии должны уметь выводить информацию о себе. Поскольку эта информация хранится в различных полях производных классов, функцию вывода нельзя реализовать в базовом классе. Естественно назвать ее во всех классах одинаково и объявить как виртуальную с тем, чтобы ее можно было вызывать в зависимости от фактического типа объекта, с которым работают через базовый класс.

Для представления общих понятий, которые предполагается конкретизировать в производных классах, используют протоклассы или абстрактные классы. Как правило, в абстрактном классе задается набор методов, то есть интерфейс, который каждый из потомков будет реализовывать по-своему.

Обычные (не виртуальные) методы переопределять в производных классах не рекомендуется, поскольку производные классы должны наследовать свойства базовых, а спецификатор new, с помощью которого переопределяется обычный метод, "разрывает" отношение наследования на уровне метода. Иными словами, невиртуальный метод должен быть инвариантен относительно специализации, то есть должен сохранять свойства, унаследованные из базового класса независимо от того, как конкретизируется (специализируется) производный класс.

Специализация производного класса достигается добавлением новых методов и переопределением существующих виртуальных методов.

Альтернативным наследованию механизмом использования одним классом другого является вложение, когда один класс является полем другого. Вложение представляет отношения классов "Y содержит X" или "Y реализуется посредством X". Для выбора между наследованием и вложением служит ответ на вопрос о том, может ли у Y быть несколько объектов класса X ("Y содержит X"). Кроме того, вложение используется вместо наследования тогда, когда про классы X и Y нельзя сказать, что Y является разновидностью X, но при этом Y использует часть функциональности X ("Y реализуется посредством X").

Рекомендации программисту.

1. На этапе проектирования объектно-ориентированной системы разработчик часто обнаруживает, что классы, оказывается, тесно связаны между собой. В этом случае он должен определить общие элементы таких классов и разместить их в базовом классе. После чего, воспользовавшись механизмом наследования, сформировать новые классы, обладающие более расширенными возможностями, выходящими за пределы возможностей, унаследованных ими от базового класса.

2. Необходимо помнить, что создание производного класса не влияет на исходный программный код базового класса. Наследование сохраняет целостность базового класса.

3. Разработчик объектно-ориентированного программного обеспечения должен избегать большого количества классов, потому что это часто приводит к появлению проблем управления ими и может помешать повторному использованию программных компонентов. Это происходит из-за того, что программисту становится все труднее подбирать для своих нужд самые необходимые классы в огромных библиотеках.

4. Если созданные с помощью наследования классы становятся объемнее, чем следует (т.е., содержат слишком много функций), то это может привести к нецелесообразному расходу памяти и ресурсов, требуемых для их разработки. Наследовать следует из класса, функциональные возможности которого максимально совпадают с необходимыми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]