Как указано в главе 13, мы решили предотвратить прямой доступ к большинству данных-членов класса. Это дает нам возможность проверять “глупые” значения, например отрицательные радиусы у объектов класса Circle
Мы интерпретируем экран (т.е. совокупность объектов класса Window
14.2. Класс Shape
Класс Shape
Window
на экране.• Понятие, которое связывает графические объекты с нашей абстракцией Window
• Класс, работающий с цветом и стилем, используемыми при рисовании линий. Для этого он хранит члены классов Line_style
Color
(для линий и заполнения).• Может хранить последовательности объектов класса Point и информацию о том, как их рисовать.
Опытные проектировщики отметят, что класс, обладающий только этими тремя свойствами, может иметь недостаточно общий характер. Однако мы описываем решение, которое очень далеко от общего.
Сначала опишем полный класс, а затем подробно его обсудим.
class Shape { // работает с цветом и стилем, хранит последователь -
// ность точек
public:
void draw() const; // работает с цветом и рисует линии
virtual void move(int dx, int dy); // перемещает фигуры +=dx
// и +=dy
void set_color(Color col);
Color color() const;
void set_style(Line_style sty);
Line_style style() const;
void set_fill_color(Color col);
Color fill_color() const;
Point point(int i) const; // доступ к точкам только для чтения
int number_of_points() const;
virtual ~Shape() { }
protected:
Shape();
virtual void draw_lines() const; // рисует линии
void add(Point p); // добавляет объект p к точкам
void set_point(int i, Point p); // points[i]=p;
private:
vector
Color lcolor; // цвет для линий и символов
Line_style ls;
Color fcolor; // заполняет цветом
Shape(const Shape&); // копирующий конструктор
Shape& operator=(const Shape&);
};
Это относительно сложный класс, разработанный для поддержки работы множества графических классов и представления общего понятия о фигуре на экране. Однако в нем всего четыре данных-членов и пятнадцать функций. Более того, эти функции почти все тривиальны, так что мы можем сосредоточиться на вопросах проектирования. В оставшейся части главы мы пройдемся по всем членам шаг за шагом и объясним их роль в классе.
14.2.1. Абстрактный класс
Сначала рассмотрим конструктор класса Shape
protected:
Shape();
который находится в разделе protected
Shape
(используя обозначение :Shape
). Иначе говоря, класс Shape
можно использовать только в качестве базы для других классов, таких как Line
и Open_polyline
. Цель ключевого слова protected:
— гарантировать, что мы не сможем создать объекты класса Shape
непосредственно.Рассмотрим пример.
Shape ss; // ошибка: невозможно создать объект класса Shape