Технологии программирования
Шрифт:
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя);
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять
Обязанности объектов класса TDBListBox:
— обеспечивать связь с источником данных (TDataSource);
— очищать список;
— обеспечивать возможность вывода нескольких элементов из списка;
— определять номер элемента списка по координатам точки, принадлежащей объекту класса TDBListBox;
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BMCLICK (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя);
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
При внимательном рассмотрении обязанностей, вменяемых объектам перечисленных классов, можно заметить, что некоторые из них совпадают, т. е. оказываются общими для объектов разных классов. Следует также отметить, что некоторые из обязанностей являются общими для объектов всех классов, а некоторые — лишь для ограниченного набора.
Логично было бы ввести дополнительные классы, объекты которых имели бы общие для рассмотренных классов обязанности. Тогда рассмотренные классы (TDataSource, TButton, TRadioButton, TListBox, TDBListBox) могли бы унаследовать функции, обеспечивающие выполнение этих обязанностей у введенных дополнительных классов (в объектно-ориентированном программировании имеется механизм, который так и называется — механизм наследования, — который делает доступными из дочерних классов свойства и методы, с учетом прав доступа, разумеется, из родительских (или базовых) классов).
Попытаемся выделить упомянутые классы и назначить им их обязанности:
Обязанности объектов класса Класс_1:
— обеспечивать
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
Обязанности объектов класса Класс_2:
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BM_CLICK (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя).
Обязанность объектов класса Класс_3:
— обрабатывать сообщения WM_LBUTTONDOWN и WM_LBUTTONDBLCLK (нажатие и двойное нажатие левой кнопки мыши).
Обязанности объектов класса Класс_4:
— очищать список;
— обеспечивать возможность нахождения нескольких элементов из списка;
— определять номер элемента списка по координатам точки, принадлежащей объекту класса TDBListBox.
Теперь, исключив из множества обязанностей объектов рассматриваемых классов те, которые переданы дополнительным классам, перечислим оставшиеся обязанности:
Обязанности класса TDataSource:
— контролировать доступ пользователя к элементам TDataSet;
— обеспечивать возможность определения, подключен ли TDataSource к некоторому элементу TDataSet.
Итак, обязанности класса Tbutton — программно эмулировать нажатие кнопки; класса TradioButton — определять, какая из кнопок с зависимой фиксацией выбрана; классов TlistBox и TDBListВох — обеспечивать связь с источником данных (TDataSource).
В результате получена иерархия классов (рис. 8.12), которая обеспечивает исключение избыточности кода (функции, осуществляющие выполнение объектами разных классов одинаковых обязанностей, кодируются приблизительно, а иногда совершенно одинаково), повышает обозримость кода программы, а следовательно, потенциально сокращает время на ее отладку.
Теперь рассмотрим на рис. 8.13 фрагмент схемы иерархии классов для перечисленных элементов (до корневого суперкласса).
Сравнивая рисунки 8.12 и 8.13, можно заметить: