Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно. |
Введение в объектно-ориентированное программирование
Экземпляры объектов
Переменная объектного типа называется экземпляром объекта. Часто экземпляры называют просто объектами. Время жизни и видимость объектов зависят от вида и места их описания и подчиняются общим правилам Паскаля. Экземпляры объектов, так же как и переменные других типов, можно создавать в статической или динамической памяти, например:
var Vasia : monster; { описывается статический объект } pm : ^monster; { описывается указатель на объект } ... new(pm); { создается динамический объект }
Можно определять массивы объектов или указателей на объекты и создавать из них динамические структуры данных. Если объектный тип описан в модуле, для создания в программе переменных этого типа следует подключить модуль в разделе uses:
uses graph, monsters;
Доступ к элементам объекта осуществляется так же, как к полям записи: либо с использованием составного имени, либо с помощью оператора with.
Vasia.erase; with pm^ do begin init(100, 100, 30); draw; end;
При обращении указывается имя экземпляра объекта, а не имя типа. Если поля объекта являются открытыми или объектный тип описан в той же программной единице, где используется, к полям можно обращаться так же, как к методам:
pm^.x := 300; { если бы x было public }
Если объект описан в модуле, получить или изменить значения элементов со спецификатором private в программе можно только через обращение к соответствующим методам.
При создании каждого объекта выделяется память, достаточная для хранения всех его полей. Методы объекта хранятся в одном экземпляре. Для того чтобы методу было известно, с данными какого экземпляра объекта он работает, при вызове ему в неявном виде передается параметр self, определяющий место расположения данных этого объекта. Фактически внутри метода обращение к полю x объекта имеет вид self.x. При необходимости имя self можно использовать внутри метода явным образом, например @self представляет собой адрес начала области, в которой хранятся поля объекта.
Объекты одного типа можно присваивать друг другу, при этом выполняется поэлементное копирование всех полей. Кроме того, в Паскале определены правила расширенной совместимости типов объектов. Все остальные действия выполняются над отдельными полями объектов.
В пример 6.2 приведен пример программы, использующей модуль monsters.
program test_monster; uses graph, crt, monsters; var Vasia : monster; { 1 } x, y : word; gd, gm : integer; begin gd := detect; initgraph(gd, gm, '...'); if graphresult <> grOk then begin writeln('ошибка инициализации графики'); exit end; Vasia.init(100, 100, 10, 10); { 2 } Vasia.draw; { 3 } Vasia.attack; { 4 } readln; x := 110; while x < 200 do begin Vasia.move(x, x); inc(x, 7); { 5 } Vasia.hit; { 6 } delay(200); end; readln; end.Листинг 6.2. Пример использования модуля monsters
Для тестирования объекта monster в программе определена переменная Vasia типа monster (оператор 1). Для нее вызываются процедуры инициализации (2), отрисовки (3) и атаки (4), а затем перемещения по экрану (5) с имитацией попадания в объект при каждом перемещении (6). Таким образом проверяется работоспособность всех методов объекта.
Пример программы, в которой используется массив объектов типа monster, приведен в пример 6.3. Все объекты инициализируются случайными значениями, а затем начинают хаотически перемещаться по экрану. Если два монстра оказываются на достаточно близком расстоянии друг от друга, они считаются атакованными (для обоих экземпляров вызывается метод hit ). Выход из этой в высшей степени медитативной программы, которую можно назвать "монстры от испуга скушали друг друга", выполняется по нажатию любой клавиши.
<$Mmonster _game>program dinner; uses graph, crt, monsters; const n = 30; var stado : array [1 .. n] of monster; x, y : array [1 .. n] of integer; gd, gm : integer; i, j : word; begin gd := detect; initgraph(gd, gm, '...'); if graphresult <> grOk then begin writeln('ошибка инициализации графики'); exit end; randomize; for i := 1 to n do begin stado[i].init(random(600), random(440), random(10), random(8)); stado[i].draw; end; repeat for i := 1 to n do begin x[i] := random(600); y[i] := random(440); stado[i].move(x[i], y[i]); end; for i := 1 to n – 1 do for j := i + 1 to n do if (abs(x[i] – x[j]) < 15) and (abs(y[i] – y[j]) < 15) then begin stado[i].hit; stado[j].hit; end; delay(200); until keypressed; end.Листинг 6.3. Пример использования массива объектов типа monster