
- •1. Абстрактные типы данных
- •Пример 1
- •1.4. Разработка объектов
- •1.4.1. Объекты и композиция
- •Пример 3
- •1.4.3. Объекты и наследование
- •1.4.4. Наследование в программировании
- •1.4.5. Упорядоченные списки и наследование
- •1.4.6. Повторное использование кода
- •1.4.7. Спецификации класса SeqList и OrderedList
- •1.5. Приложения с наследованием классов
- •1.6. Разработка объектно-ориентированных программ
- •1.6.1. Анализ задачи/определение программы
- •1.6.2. Разработка
- •1.6.3. Кодирование
- •1.6.4. Тестирование
- •1.6.5. Иллюстрация программной разработки: Dice график
- •Замечание
- •Программа 2. Диаграмма бросания костей
- •1.7. Тестирование и сопровождение программы
- •1.7.1. Объектное тестирование
- •1.7.2. Тестирование управляющего модуля
- •1.7.3. Программное сопровождение и документирование
- •1.9. Абстрактные базовые классы и полиморфизм
- •1.9.1. Полиморфизм и динамическое связывание
- •2.1. Пользовательский тип — класс
- •2.1.1. Объявление класса
- •Пример 1.
- •2.1.2. Конструктор
- •2.1.3. Объявление объекта
- •2.1.4. Реализация класса
- •2.1.5. Реализация конструктора
- •2.1.6. Создание объектов
- •Пример 2.
- •2.2. Примеры классов
- •2.2.1. Класс Temperature
- •2.2.2. Реализация класса Temperature
- •2.2.3. Класс случайных чисел
- •Пример 3.
- •2.2.4. Реализация класса RandomNumber
- •2.3. Объекты и передача информации
- •2.3.1. Объект как возвращаемое значение
- •2.3.2. Объект как параметр функции
- •2.4. Массивы объектов
- •2.4.1. Конструктор умолчания
- •2.5. Множественные конструкторы
- •2.5.1. Реализация класса Date
- •2.6. Практическое применение: Треугольные матрицы
- •2.6.1. Свойства верхней треугольной матрицы
- •2.6.2. Хранение треугольной матрицы
- •Пример 4.
- •Пример 5.
- •2.6.3. Класс TriMat
- •2.6.5. Реализация класса TriMat
1.4.4. Наследование в программировании
Объектно-ориентированное программирование предоставляет механизм, посредством которого производному классу разрешается наследовать данные и операции от базового класса. Этот механизм, называемый наследование класса (class inheritance), позволяет производному классу использовать данные и операции, которые были определены ранее в базовом классе. Производный класс может добавлять новые операции или переписывать некоторые операции, так как он устанавливает методы для обработки его данных. Аналогично, ребенок может наследовать дом или автомашину от его (или ее) родителя. Затем он может затем н: пользовать этот дом или автомашину. Если необходимо, наследник может модифицировать дом, чтобы он соответствовал его (или ее) особым условиям.
Проиллюстрируем наследование класса с помощью линейного списка, названного SeqList, который сохраняет информацию в последовательном порядке. Список – это важная и знакомая структура, используемая для ведения инвентаризационных записей, графика деловых встреч, типов и количества необходимых гастрономических товаров и т.д. Наследование возникает, когда мы объявляем упорядоченный список, который является особым типом последовательного списка. Упорядоченный список использует все базовые методы обработки списка из последовательного списка и обеспечивает свою собственную операцию вставки для того, чтобы элементы списка сохранялись в возрастающем порядке.
В линейном списке, содержащем N элементов, любой элемент занимает одно из положений от 0 до N-1. Первое положение является передним, а последнее – конечным. На рис. 1.3 показан неупорядоченный список целых чисел с шестью элементами.
0 5
3
22
45
23
8
Рис. 1.3. Неупорядоченный линейный список
Базовые операции SeqList включают операцию Insert, которая добавляет новый элемент в конец списка (Рис. 1.4), и операцию Delete, которая удаляет первый элемент списка, соответствующий ключу. Вторая функция удаления, называемая DeleteFront, удаляет первый элемент в списке (Рис. 1.5). Структура определяет размер списка с помощью ListSize и предоставляет операцию Find, выполняющую поиск элемента в списке. Для управления данными пользователь может определить, является ли список пустым, и удалить его операцией Clear-List.
Insert (10)
5
3
22
45
23
8
10
Рис. 1.4. Вставка значения 10
5
3
22
23
8
10
Delete (45)
3
22
45
23
8
10
DeleteFront
Рис. 1.5. Удаление элемента 45 и удаление первого элемента в списке
Данный класс предоставляет метод GetData, позволяющий клиенту читать значение любого элемента списка. Например, для нахождения максимального значения в списке мы можем начать сканирование списка с нулевого элемента. Процесс заканчивается при достижении конца списка, который определяется с помощью ListSize. В каждом положении следует обновлять максимальное значение, если текущее значение (GetData) больше, чем текущий максимум. Например, для второго элемента списка число 22 сравнивается с предыдущим максимумом, равным 3, поэтому текущее максимальное значение заменяется на 22. В конечном счете, число 23 определяется как максимальный элемент в списке.
ADT SeqList
Данные
Неотрицательное целое число, указывающее количество элементов, находящихся в данный момент в списке (размер), и список элементов данных.
Операции
Конструктор
Начальные значения: Нет
Процесс: Установка размера списка на 0
ListSize
Вход: Нет
Предусловия: Нет
Процесс: Чтение размера списка
Выход: Размер списка
Постусловия: Нет
ListEmpty
Вход: Нет
Предусловия: Нет
Процесс: Проверка размера списка
Выход: Возвращать TRUE, если список пустой; в противном случае – возвращать FALSE.
Постусловия: Нет
ClearList
Вход: Нет
Предусловия: Нет
Процесс: Удаление всех элементов из списка и установка размера списка на 0.
Выход :Нет
Постусловия: Список пустой
Find
Вход: Элемент, который необходимо найти в списке.
Предусловия: Нет
Процесс: Сканирование списка для нахождения соответствующего элемента.
Выход: Если соответствующий элемент списка не найден, возвращать FALSE; если он найден, возвращать TRUE и этот элемент.
Постусловия: Нет
Insert
Вход: Элемент для вставки в список
Предусловия: Нет
Процесс: Добавление этого элемента в конец списка.
Выход: Нет
Постусловия: Список имеет новый элемент; его размер увеличивается на 1.
Delete
Вход: Значение, которое должно быть удалено из списка.
Предусловия: Нет
Процесс: Сканирование списка и удаление первого найденного элемента в списке. Не выполнять никакого действия, если этот элемент не находится в списке.
Выход: Нет
Постусловия: Если соответствующий элемент найден, список уменьшается на один элемент.
DeleteFront
Вход: Нет
Предусловия: Список не должен быть пустым.
Процесс: Удаление первого элемента из списка.
Выход: Возвращать значение удаляемого элемента
Постусловия: Список имеет на один элемент меньше.
GetData
Вход: Положение (роs) в списке.
Предусловия: Генерируется ошибка доступа, если роз меньше 0 или больше 0 (размер -1)
Процесс: Получать значение в положении роs в списке.
Выход: Значение элемента в положении роs.
Постусловия: Нет
Конец AQT SeqList