TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Живой Журнал

Гостевая книга

Рассылка

Благодарности

Об авторе

ООП - это очень просто

Выпуск № 4

Все мы невежды, только в разных областях ...
/У. Роджерс/

В этом выпуске:
  1. Извинения.
  2. Разбор полетов
  3. Объяснительная Бориса по поводу якобы лжи ...
  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 не существует! Защита установлена! Удалите скобки комментария в программе и получите Error 44: Field identifier expected.

[ в начало ]

Куда дальше? - Пора подумать о наследстве!

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

Объекты редко пишутся по одному. Как правило, они сразу задумаются как цепочка все более совершенных созданий. Семья, своего рода - дедушка, отец, сын, внук ... (мафия!). Первый (базовый) объект очерчивает только общие контуры предстоящей работы. У него есть только самые основные свойства. Очень часто методы такого объекта нельзя вызывать. Создатели Borland Pascal придумали специальный механизм для реализации это запрета. (Такие методы называют абстрактными, а вызов их генерирует ошибку Error 211: Call to abstract method "Вызов абстрактного метода").

Детки базового объекта наследуют все его свойства  (методы и поля), а также дополняют его своими свойствами, полями, совершенствуют поведение методов. И как в семье, у отца может быть несколько детей. Они похожи, но каждый решает свою задачу. Например, Наберите в 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 цветов.

Если не сложно, напишите, есть у Вас проблемы с графикой в "обычном" борландовском Паскале или нет, и что решили насчет графики. Пока я буду писать о том, что можно реализовать в текстовом режиме вывода

ДА!! Я посмотрел свои архивы и нашел там кое-что о реализации различных алгоритмов, имеющих практическое значение. Мы, авторы сайта, решили создать отдельную рассылку, в которой будем писать, как решать уравнения численными методами, как интегрировать, как дифференцировать, а также о всем, "что потребуется впредь". Может мы и не правы, но подписаться можно на страничке наших рассылок

[ в начало ]

© Борис Сурин

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz