TURBO PASCAL |
Новости
|
ООП - это очень простоВыпуск № 4 Все мы невежды, только в разных областях ... :-))Уважаемые подписчики, я конечно дико извиняюсь за задержку очередного выпуска. Среди прочих дел меня отвлекала одна задача: реализовать максимально быстрое движение точки по эллипсу. Использовать готовый алгоритм я не хотел, а думать все какие-то делишки мешали. В эти выходные удалось подумать. Сейчас напишу выпуск, отлажу программу и обязательно ее опишу. Думаю, что многим понадобиться. А сейчас - к ООПу[ в начало ] Разбор полетовВо всех примерах, описанных в предыдущих выпусках, было "мина": к частному (private) полю обращаться можно. Попробуйте сами в примере второго выпуска добавьте в исполняемый блок программы то, что ниже выделено жирным: BEGIN SimplestObj.SetValue(-2); {Получите сообщение об ошибке} SimplestObj.SetValue(2000); {Записали} WriteLn(SimplestObj.GetValue); {Прочитали} {ЭХ! Поиздеваемася над "защитой"} SimplestObj.Field:=-2354; WriteLn('Получилось! Field = ', SimplestObj.Field,' , а говорили, что нельзя!'); END. Теперь и Вы видите, что нет никакой защиты! Но подождите с обвинениями, пока не прочитаете мою
объяснительную по этому поводу: Объяснительная Бориса по поводу якобы лжи ...Не виноват я - это все Паскаль! Borland Pascal! Он, точно, он! Дело в том, что в Borland Pascal защита приватных (личных) полей не была реализована в полной мере. Сделано это было в Object Pascal (Delphi) с помощью свойств (property). В Borland Pascal любые поля объекта доступны в пределах модуля, в котором описан объект, и недоступны во всех других. Первое положение продемонстрировал пример, показанный выше. Под модулем здесь понимается файл с исходным кодом программы, имеющий расширение .PAS: или файл, в начале которого находится ключевое слово PROGRAM (или нет ничего), или UNIT - (модуль, структурная единица). Однако нельзя утверждать, что это был недосмотр. Я думаю, что были использованы следующие доводы. Когда программист пишет код модуля, он точно знает и помнит все тонкости использования полей и методов объекта. Следовательно, для правильного решения задачи достаточно простой самодисциплины программиста. Но вот код отлажен и используется с помощью директивы USES. Теперь доступ к объекту получают пользователи. Эти вредители так и норовят ввести что-нибудь эдакое ... . И вот тут-то и срабатывает защита. Давайте проведем эксперимент над прежним нашим объектом. Программа будет состоять из двух файлов: MAIN.PAS: program Main; uses MyUnit; VAR SimplestObj: TSimplestObj; BEGIN SimplestObj.SetValue(-2); SimplestObj.SetValue(2000); WriteLn(SimplestObj.GetValue); { SimplestObj.Field:=-2233; WriteLn(SimplestObj.Field)} END.и MyUnit.PAS: unit MyUnit; interface TYPE TSimplestObj = object private Field: Integer; public procedure SetValue(AValue: Integer); function GetValue: Integer; end; implementation procedure TSimplestObj.SetValue; begin if AValue < 0 then Writeln('Введено неверное значение ',AValue) else Field:=AValue; end; function TSimplestObj.GetValue; begin GetValue:=Field end; END. Для того, чтобы программа запускалась по нажатию комбинации Ctrl+F9 из
любого окна интегрированной среды разработки
программ Borland Pascal нужно установить "первичный" файл с помощью пункта меню
Compile / Primary File ... main.pas.
Теперь можете экспериментировать сколько хотите, прямого доступа к полю Field не существует!
Защита установлена! Удалите
скобки комментария в программе и получите Куда дальше? - Пора подумать о наследстве!Объекты не задумывались для реализации механизма инкапсуляции только. Пожалуй, самое главное, что отличает объектно-ориентированное программирование от структурного - это наследование.Объекты редко пишутся по одному. Как правило, они сразу задумаются как цепочка все более совершенных
созданий. Семья, своего рода - дедушка, отец, сын, внук ... (мафия!). Первый (базовый)
объект очерчивает только общие контуры предстоящей работы. У него есть только самые основные свойства.
Очень часто методы такого объекта нельзя
вызывать. Создатели Borland Pascal придумали специальный механизм для реализации это запрета.
(Такие методы называют абстрактными, а вызов их генерирует ошибку
Детки базового объекта наследуют все его свойства (методы и поля), а также дополняют его своими свойствами, полями, совершенствуют поведение методов. И как в семье, у отца может быть несколько детей. Они похожи, но каждый решает свою задачу. Например, Наберите в IDE BP "TApplication", нажмите Ctrl+F1 и выберите Hierarchy Diagram. Если у Вас имеется справка по Turbo Vision, то Вы увидите пример такой цепочки. Без использования ООП такое поведение можно было бы реализовать но только в виде цепочки модулей. И пришлось бы для подпрограмм - наследников придумать новые уникальные имена. Иначе мы потеряли бы возможность вызывать методы предков. Может это и не так страшно, но неудобно помнить десятки имен практически одного и то. А в объектах ... - раздолье. Есть виртуальные методы. Само название говорит за себя! Однако для реализации пришлось ввести дополнительные механизмы и правила. Напишу о них в следующем выпуске, а сейчас нужно посоветоваться с Вами: Наиболее эффектная демонстрация возможностей механизма наследования получается в графическом режиме. И вот тут есть проблема, связанная с развитием техники. Стандартный графический режим, который использует Borland Pascal - VGA - это "такая ерунда" для современных компьютеров, что они таковой не поддерживают. Точнее, если при установке графического режима (как? - посмотрите справку по ключевому слову InitGraph. Только не забудьте в качестве последнего, третьего параметра передать процедуре путь к файлу EGAVGA.bgi. У меня "C:/BP/BGI") Вы захотите отрабатывать нажатие клавиш, то Вам это не удастся. Испытайте это. Вместо строки Line(0, ...) напишите такой код: repeat Line(Random(GetMaxX), Random(GetMaxY), Random(GetMaxX), Random(GetMaxY)); if KeyPressed then begin ch:=ReadKey; Case ch of 'r': SetColor(red); 'b': SetColor(blue); end; end; until ch = #27;да, и добавьте в USES модуль CRT (для ReadKey). Запустите программу, если цвет меняется, значит, можно продолжать писать в Borland Pascal. Если нет и программа вылетает "на фиг", то нужно кардинальное решение. Самым лучшим был бы переход на FreePascal, который можно скачать на нашем сайте, (НО ОН ОЧЕНЬ ВЕЛИКя, хотя и хорош), либо использовать драйвер VESA, один из них (для 16 цветов) находится в архиве bgi_chr.zip, а второй в архиве vesa256.ZIP - для 256 цветов. Если не сложно, напишите, есть у Вас проблемы с графикой в "обычном" борландовском Паскале или нет, и что решили насчет графики. Пока я буду писать о том, что можно реализовать в текстовом режиме вывода ДА!! Я посмотрел свои архивы и нашел там кое-что о реализации различных алгоритмов, имеющих практическое значение. Мы, авторы сайта, решили создать отдельную рассылку, в которой будем писать, как решать уравнения численными методами, как интегрировать, как дифференцировать, а также о всем, "что потребуется впредь". Может мы и не правы, но подписаться можно на страничке наших рассылок © Борис Сурин |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |