Опубликован: 03.09.2010 | Доступ: свободный | Студентов: 2844 / 491 | Оценка: 4.11 / 3.69 | Длительность: 10:38:00
Лекция 6:

Введение в объектно-ориентированное программирование

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

Экземпляры объектов

Переменная объектного типа называется экземпляром объекта. Часто экземпляры называют просто объектами. Время жизни и видимость объектов зависят от вида и места их описания и подчиняются общим правилам Паскаля. Экземпляры объектов, так же как и переменные других типов, можно создавать в статической или динамической памяти, например:

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
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
София Шишова
София Шишова

Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно.

Иван Севастьянов
Иван Севастьянов
Россия
Евгений Куракин
Евгений Куракин
Россия, г. Гуково