Язык программирования C++ от Страуструпа


         

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


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

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 называется производным по отношению к классу




Содержание  Назад  Вперед