[ <<< | 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 | Источники | >>> ]