[ <<< | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Источники | >>> ]
© 2001 А.И. Легалов
Рассмотрим использование представленной выше схемы формирования объектного обобщения на примере решения задачи 1. Разработку обобщения начнем с опорного класса, который должен содержать необходимый интерфейс обобщенной геометрической фигуры. При этом создадим абстрактный класс, позволяющий обеспечить более надежный контроль интерфейсов производных классов.
//---------------------------------------------------------------- // Класс, обобщающий все имеющиеся фигуры. // Является абстрактным, обеспечивая, тем самым, // проверку интерфейса class shape { public: virtual void In() = 0; // ввод данных из стандартного потока virtual void Out() = 0; // вывод данных в стандартный поток virtual double Area() = 0; // вычисление площади фигуры }; //---------------------------------------------------------------- |
Опорные процедуры, располагаемые внутри опорного класса и специализаций опоры, предполагается в дальнейшем использовать следующим образом:
Все эти виртуальные абстракции начинают обрастать конкретным содержанием только при реализации конкретных специализаций опоры. При этом, разработка специализаций может осуществляться независимо и поэтапно, так как между ними отсутствует какая-либо взаимосвязь. Поэтому, в начале разработаем прямоугольник и его методы.
//---------------------------------------------------------------- // прямоугольник class rectangle: public shape { int x, y; // ширина, высота public: // переопределяем интерфейс класса void In(); // ввод данных из стандартного потока void Out(); // вывод данных в стандартный поток double Area(); // вычисление площади фигуры rectangle(int _x, int _y); // создание с инициализацией. rectangle() {} // создание без инициализации. }; //---------------------------------------------------------------- // Динамическое создание прямоугольника по двум сторонам rectangle::rectangle(int _x, int _y): x(_x), y(_y) {} //---------------------------------------------------------------- // Ввод параметров прямоугольника void rectangle::In() { cout << "Input Rectangle: x, y = "; cin >> x >> y; } //---------------------------------------------------------------- // Вывод параметров прямоугольника void rectangle::Out() { cout << "It is Rectangle: x = " << x << ", y = " << y << endl; } //---------------------------------------------------------------- // Вычисление площади прямоугольника double rectangle::Area() { return x * y; } //---------------------------------------------------------------- |
Затем можно приступать к созданию треугольника.
//---------------------------------------------------------------- // треугольник class triangle: public shape { int a, b, c; // стороны public: // переопределяем интерфейс класса void In(); // ввод данных из стандартного потока void Out(); // вывод данных в стандартный поток double Area(); // вычисление площади фигуры triangle(int _a, int _b, int _c); // создание с инициализацией triangle() {} // создание без инициализации. }; //---------------------------------------------------------------- // Инициализация уже созданного треугольника по трем сторонам triangle::triangle(int _a, int _b, int _c): a(_a), b(_b), c(_c) {} //---------------------------------------------------------------- // Ввод параметров треугольника void triangle::In() { cout << "Input Triangle: a, b, c = "; cin >> a >> b >> c; } //---------------------------------------------------------------- // Вывод параметров треугольника void triangle::Out() { cout << "It is Triangle: a = " << a << ", b = " << b << ", c = " << c << endl; } //---------------------------------------------------------------- // Вычисление площади треугольника double triangle::Area() { double p = (a + b + c) / 2.0; // полупериметр return sqrt(p * (p-a) * (p-b) * (p-c)); } //---------------------------------------------------------------- |
В контейнере имеется массив опор объектных обобщений, обеспечивающий подключение и обработку альтернатив. Следует отметить, что разработка контейнера, представленного при обсуждении агрегатов, осуществляется совершенно независимо от конкретных геометрических фигур. Необходимы знания только структуры базового класса и его интерфейса. Как и ранее, реализации методов вынесены за пределы классов, чтобы обеспечить меньшую зависимость между программными объектами, что существенно при эволюционном проектировании больших программных систем. Код всего примера представлен в уже упоминавшемся архиве oop_examp1.zip.
[ <<< | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Источники | >>> ]