Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

Пользователей: 13,370
новичок: dogoco6
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
Моделирование информационно-поисковой библиографической системы на gpss ...
Моделирование круглосуточного интернет кафе на GPSS + Отчет

ОСНОВЫ ООП В DELPHI OBJECT PASCAL. ОБЪЯВЛЕНИЕ КЛАССОВ


Собственные типы в Pascal, такие как массивы и записи, позволяют программисту вводить новые абстракции. Их недостатками являются невозможность скрыть реализацию типов, ввести операции над ними и пр. В этом параграфе мы опишем правила объявления классов — основных типов пользователя в ООП, которые отчасти устраняют приведенные недостатки и, в этом смысле, гораздо больше напоминают стандартные встроенные типы языка.
ОСНОВЫ ООП В DELPHI OBJECT PASCAL. ОБЪЯВЛЕНИЕ КЛАССОВ
Как и объявления других типов, объявления классов помещаются в разделе type. Объявление начинается с имени класса TPoint, затем следует знак равенства и ключевое слово class. Заканчивается объявление словом end.
Таким образом, объявления класса напоминает объявление записи. Fx и Fy как и в записи называются полями. Это элементы данных, которые будут индивидуальными у каждого объекта этого класса. А вот последующая часть объявления не встречалась в записях. В ней объявлены две процедуры и три функции. Процедуры и функции, включенные в описание класса, называются методами — методами работы с объектами данного класса. SetX, SetY позволяют задать значения координат точки, GetX, GetY — получить значение одной из координат, а Distance — установить расстояние от данной точки до точки p, переданной в качестве параметра.
Обратите внимание на имя класса — TPoint. Оно начинается с буквы T. Это один из элементов, так называемой венгерской нотации — соглашения об именах. T означает, что это имя типа. Fx означает, что это поле (field).
Приведенное объявление демонстрирует одну из сторон понятия инкапсуляции — элементы данных объединены в одно понятие со средствами работы с этими данными.
Где же описания алгоритмов методов нашего класса? Они должны располагаться в части implementation того же модуля, где объявлен класс и выглядят следующим образом:

В описаниях ко всем именам процедур и функций добавлено имя класса. Это позволяет компилятору различать методы разных классов, имеющих одинаковые имена. Никаких других различий между объявленными методами и заголовками в реализации не допускается. Должны совпадать даже имена формальных параметров.
Из примеров видно, что поля объекта не нужно передавать параметрами в методы. Обратите внимание на то, как в функции Distance выбираются поля своего объекта и объекта, переданного как параметр. Поля самого объекта используются непосредственно, тогда как для обращения к полям объекта–параметра, указывается имя объекта, а через точку имя поля, т.е. так же как для записи.
Одна из сложностей при переходе от процедурного программирования к ООП состоит в том, что программист должен понять схему создания и уничтожения объектов, в то время как создание и уничтожение обычных переменных продумано разработчиками языка, и о нем можно почти не задумываться.
Подчеркнем, что во всех случаях описание типа не приводит к созданию объекта данных этого типа. В Pascal переменные обычных типов создаются объявлением их имён в разделе var или путем передачи в процедуру в качестве параметра.
В ООП принято говорить не о переменных или данных, а об экземплярах (instances) объектов данного класса. Таким образом, следует различать объявление класса (типа) и создание экземпляров объектов этого класса. Аналогом экземпляров объектов являются переменные, но понятие объекта включает как данные, так и методы работы с ними. В дальнейшем, фраза типа “объект класса …” используется как синоним “экземпляр объекта класса …”, а иногда термин “объект данных” применяется и в отношении обычных переменных.
После разъяснений терминологии обратимся к процессу создания объектов. В отличие от обычных переменных, в Delphi Object Pascal при объявлении имени объекта в разделе var или передаче его в качестве параметра, создается не экземпляр объекта, а лишь ссылка на него. Сам объект еще предстоит создать и запомнить его адрес в отведенной ссылке, т.е. в Delphi все объекты динамические. Таким образом,
в Delphi все объекты динамические. Они автоматически не появляются и не исчезают. Созданием и уничтожением объектов управляет программист.
К детальному описанию процесса создания и уничтожения объектов в Delphi мы вернемся в разделе Конструкторы и Деструкторы, а до тех пор будем иметь ввиду упрощенную картину. В простейшем случае, для создания объекта данных достаточно выделить под него место в памяти. Это же нужно сделать и для объекта любого класса, а адрес выделенной области памяти нужно запомнить в ссылке на объект.
Выполняется выделение памяти специальным методом — конструктором Create, который имеется у каждого объекта, даже в тех случаях, когда он не описан среди методов. Откуда берется Create станет ясно позже. Вот как можно создать экземпляр точки:

Конструктор TPoint.Create выделил место в памяти и вернул указатель на выделенную область. Количество выделенной памяти в точности соответствует размеру объекта класса TPoint. Если по какой–либо причине создать объект не удастся, конструктор вернет значение Nil.
В Pascal в одних случаях переменные при создании инициализируются нулевыми значениями, а в других содержат случайный мусор. Что происходит при создании объектов? Оказывается, конструктор автоматически заполняет все поля нулевыми значениями.
После создания объекта можно выполнять различные действия над ним, например, задать значения координат
a.SetX(1); a.SetY(0);



Теперь координаты точки a равны (1, 0).
Обратите внимание на то, что при вызове конструктора, мы использовали имя класса, в то время как при вызове других методов — имя объекта. Это естественно, до создания объекта его методы вызвать нельзя, поэтому для вызова конструктора используется имя класса.
Вернемся к особенностям, связанным с динамическим характером объектов в Delphi. В a хранится ссылка на объект, но при использовании a значок ^ не ставится . В большинстве случаев это удобно — иначе пришлось бы для любого объекта указывать имя со шляпкой. С другой стороны, хотя шляпка отсутствует, программист обязан помнить, что a содержит лишь адрес, а не сам объект. Перечислим основные следствия из этого факта. Первое связано с операцией присваивания. Команда
b:=a;



приведет не к тому, что создастся объект b равный по значению a, а к тому, что на единственный объект, созданный при вызове конструктора будут указывать две ссылки a и b.
Второе следствие состоит в том, что даже если объект b уже создан, присваивание не приведет к копированию значений. Так после

экземпляр объекта, на который указывала ссылка b будет безвозвратно “утерян”, т.е. сам объект останется, но его адрес не сохранится. И снова, обе ссылки будут указывать на один и тот же объект. Правильный код для копирования значения в этом случае выглядит так

Сравнение a и b так же позволяет выяснить лишь, указывают ли обе ссылки на один и тот же объект.
Из того, что a является ссылкой, следует, что при передаче a в процедуру как фактического параметра, всегда будет передана ссылка на объект, т.е. все изменения будут выполняться над оригиналом объекта.
Наконец, если объект был объявлен и создан в процедуре, то после выхода из процедуры объект не исчезнет, а исчезнет лишь ссылка на него. Вообще, выделенная под объекты память автоматически освобождается только после завершения работы всей программы. В остальных случаях объекты уничтожает программист.
Для уничтожения каждый объект имеет стандартный метод Free и, так называемый, стандартный деструктор Destroy. Эти методы не имеют параметров и просто освобождают память. Метод Free, проверяет, не является ли указатель на объект нулевым и затем вызывает Destroy, поэтому он более безопасен и применять для уничтожения объектов следует именно его.
Объект опасно уничтожать дважды, как правило это приводит к ошибке. Если объекты уничтожаются в разных местах программы, то удобно одновременно с уничтожением устанавливать ссылку на объект в Nil, чтобы сообщить в остальные части программы, что объект уже отсутствует. Повторный вызов Free для такого объекта не будет иметь никаких последствий.
Вот как может выглядеть программа, вычисляющая расстояние между точками (1, 0) и (0, 1):

Подчеркнем, что a := Nil и b := Nil — не являются необходимыми, а просто мера предосторожности.
Опубликовал Kest May 27 2011 10:13:07 · 0 Комментариев · 13185 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
JanButtonsV
Создание отчетов ...
Распознавание тек...
Конвертирование и...
Профессиональное ...
Библия хакера 2. ...
Измерение тактово...
mmmJlabel
Анимированное поя...
Редактор анимаций
Delphi 2005 для .NET
Добавление басса ...
CaptionButton
начисление процен...
C++ Builder: Книг...
Запрет гостям ск...
RAS
Экранная лупа
Исправление проц...
Алгоритм трассиро...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97836
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
— алгоритм 474— от...
Выравнивание текст...
PHP и Web. Кэширов...
Онлайн играть в ка...
лао Защита данных ...
Как зарабоатывать ...
Формат блока YMODEM
Основы спрайтовой ...
Стоимость корневог...
Разновидности форм
Инкапсуляция и С++
GUNZIP
может быть установ...
Акселерометры и ор...
Игроки
No inherited metho...
Принципы библиотек...
Кнопка с рисунком
Разработка инфогра...
Обзор db-компонент...
Эльдорадо аппараты...
Вся правда о тИЦ
Эротическое белье ...
Работа с папками SMS
Рост в женском пре...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?