Многие люди в Китае считают Delphi своим предпочтительным инструментом разработки. Причина, конечно, в том, что Delphi предоставляет разработчикам множество функций: объектно-ориентированную разработку, дизайн визуального интерфейса, богатые компоненты и многоплатформенную переносимость (новые функции Delphi6).
Но для новичков объектно-ориентированное мышление может быть не самым большим ощущением, которое им приносит Delphi. Визуальный дизайн интерфейса и богатые и разнообразные доступные компоненты оставляют самое глубокое и незабываемое впечатление. Серьезным последствием этого является то, что новички часто в течение длительного времени сосредотачиваются только на использовании существующих компонентов VCL, предоставляемых Delphi, при этом пренебрегая влиянием объектно-ориентированного мышления на всю Delphi. Смысл, содержащийся в архитектуре компонентов. система.
Следующий фрагмент кода содержит одну из наиболее распространенных ошибок, которые часто допускают новички. Хотя эта ошибка не является грамматической, она показывает, что объектно-ориентированное мышление пользователя необходимо усилить:
вар
Форма1: ТФорм1;
выполнение
{$R *.dfm}
PROcedure TForm1.Button1Click(Отправитель: TObject);
начинать
ShowMessage(Form1.Caption); // <-- Здесь есть некоторые проблемы с использованием Form1.
конец;
На первый взгляд в таком коде нет ничего плохого. Однако появление здесь Form1 несколько необоснованно. Очевидно, что код здесь написан для реализации метода ButtonClick класса TForm1, а Form1, как экземпляр класса TForm1, фактически вписан в реализацию класса. Нет ли здесь какой-то концептуальной путаницы? к объектно-ориентированному мышлению. Оно также очень просто и может быть записано двумя способами:
1. ShowMessage(Self.Caption); // <-- Этот способ записи очень понятен. Отображаемая информация — это заголовок текущего экземпляра класса.
2. ShowMessage(Caption); // <-- Метод записи здесь тот же, что и выше, но ключевое слово Self опущено;
Три основных содержания объектно-ориентированного мышления — это инкапсуляция, наследование и полиморфизм. Проблема, выявленная в приведенном выше примере, — это проблема инкапсуляции. Подобные примеры включают в себя:
вар
Форма1: ТФорм1;
...
вар
Форма2: ТФорм2;
процедура TForm1.Button1Click(Отправитель: TObject);
начинать
Form2.Show; // <-- Использование Form2 в качестве глобальной переменной также сбивает с толку.
конец;
Приведенный выше пример может быть более общим. В большинстве случаев в проекте TForm1 и TForm2 могут иметь только один экземпляр, поэтому такой код можно считать проходимым. Но в строгом смысле он не отвечает требованиям инкапсуляции. Обратитесь к следующему коду:
тип
ТФорм1 = класс (ТФорма)
Кнопка1: Кнопка T;
процедура Button1Click (Отправитель: TObject);
частный
{Частные заявления}
FДалее: TForm;
общественный
{Публичные заявления}
свойство NextForm: TForm чтение FNext запись FNext;
конец;
вар
Форма1: ТФорм1;
выполнение
использует Unit2;
{$R *.dfm}
процедура TForm1.Button1Click(Отправитель: TObject);
начинать
если назначено(FNext), то
TForm2(FNext).Показать;
конец;
конец.
// Ниже приводится содержимое файла проекта:
программа Проект1;
использует
Формы,
Unit1 в 'Unit1.pas' {Form1},
Unit2 в «Unit2.pas» {Form2};
{$R *.res}
начинать
приложение.Инициализировать;
Приложение.CreateForm(TForm1, Form1);
Приложение.CreateForm(TForm2, Form2);
Form1.NextForm := Form2; // <-- Добавьте это предложение, чтобы код едва соответствовал требованиям инкапсуляции.
Приложение.Выполнить;
конец.
Передайте указатель Form2 на Form1 как атрибут Form1. Таким образом, Form1 при вызове соответствует принципу инкапсуляции! Конечно, эти коды лишь отражают идею инкапсуляции. На практике вы можете решить, действительно ли вы хотите реализовать ее настолько тщательно, в соответствии со своими личными привычками. Но такого рода мысли должны укорениться в уме... (Неоконченное, продолжение следует).
Еще статьи