Объектно-ориентированное программирование




Проблема состоит в том, что мы не различаем общие свойства фигур(например, фигура имеет цвет, ее можно нарисовать и т.д.) и свойстваконкретной фигуры (например, окружность - это такая фигура, которая имеетрадиус, она изображается с помощью функции, рисующей дуги и т.д.). Сутьобъектно-ориентированного программирования в том, что оно позволяетвыражать эти различия и использует их. Язык, который имеет конструкции длявыражения и использования подобных различий, поддерживаетобъектно-ориентированное программирование. Все другие языки неподдерживают его. Здесь основную роль играет механизм наследования,заимствованный из языка Симула. Вначале определим класс, задающий общиесвойства всех фигур: class shape { point center; color col; //... public: point where () { return center; } void move (point to) { center = to; draw(); } virtual void draw (); virtual void rotate (int); //... }; Те функции, для которых можно определить заявленный интерфейс, нореализация которых (т.е. тело с операторной частью) возможна только дляконкретных фигур, отмечены служебным словом virtual (виртуальные). ВСимуле и С++ виртуальность функции означает: "функция может бытьопределена позднее в классе, производном от данного". С учетом такогоопределения класса можно написать общие функции, работающие с фигурами: void rotate_all (shape v [], int size, int angle) // повернуть все элементы массива "v" размера "size" // на угол равный "angle" { int i = 0; while (i<size) { v [ i ]. rotate (angle); i = i + 1; } } Для определения конкретной фигуры следует указать, прежде всего, чтоэто - именно фигура и задать ее особые свойства (включая и виртуальныефункции): class circle: public shape { int radius; public: void draw () { /*... */ }; void rotate (int) {} // да, пока пустая функция }; В языке С++ класс circle называется производным по отношению к классуshape, а класс shape называется базовым для класса circle. Возможнадругая терминология, использующая названия "подкласс" и "суперкласс" дляклассов circle и shape соответственно. Теперь парадигма программированияформулируется так: Определите, какой класс вам необходим; предоставьте полный наборопераций для каждого класса; общность классов выразите явно с помощьюнаследования. Если общность между классами отсутствует, вполне достаточно абстракцииданных. Насколько применимо объектно-ориентированное программирование дляданной области приложения определяется степенью общности между разнымитипами, которая позволяет использовать наследование и виртуальные функции.В некоторых областях, таких, например, как интерактивная графика, естьширокий простор для объектно-ориентированного программирования. В другихобластях, в которых используются традиционные арифметические типы ивычисления над ними, трудно найти применение для более развитых стилейпрограммирования, чем абстракция данных. Здесь средства, поддерживающиеобъектно-ориентированное программирование, очевидно, избыточны. Нахождение общности среди отдельных типов системы представляет собойнетривиальный процесс. Степень такой общности зависит от способапроектирования системы. В процессе проектирования выявление общностиклассов должно быть постоянной целью. Она достигается двумя способами:либо проектированием специальных классов, используемых как "кирпичи" припостроении других, либо поиском похожих классов для выделения их общейчасти в один базовый класс. С попытками объяснить, что такое объектно-ориентированноепрограммирование, не используя конкретных конструкций языковпрограммирования, можно познакомиться в работах [2] и [6], приведенных всписке литературы в главе 11. Итак, мы указали, какую минимальную поддержку должен обеспечивать языкпрограммирования для процедурного программирования, для упрятыванияданных, абстракции данных и объектно-ориентированного программирования.Теперь несколько подробнее опишем средства языка, хотя и не самыесущественные, но позволяющие более эффективно реализовать абстракциюданных и объектно-ориентированное программирование.

1.3 "Улучшенный С"

Минимальная поддержка процедурного программирования включает функции,арифметические операции, выбирающие операторы и циклы. Помимо этого должныбыть предоставлены операции ввода- вывода. Базовые языковые средства С++унаследовал от С (включая указатели), а операции ввода-выводапредоставляются библиотекой. Самая зачаточная концепция модульностиреализуется с помощью механизма раздельной трансляции.


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: