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 цветов.
Если не сложно, напишите, есть у Вас проблемы с графикой в "обычном" борландовском Паскале или нет, и что решили насчет графики. Пока я буду писать о том, что можно реализовать в текстовом режиме вывода ДА!! Я посмотрел свои архивы и нашел там кое-что о реализации различных алгоритмов, имеющих практическое значение. Мы, авторы сайта, решили создать отдельную рассылку, в которой будем писать, как решать уравнения численными методами, как интегрировать, как дифференцировать, а также о всем, "что потребуется впредь". Может мы и не правы, но подписаться можно на страничке наших рассылок © Борис Сурин |
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |