Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
bb:redbook:208 [2019/07/23 11:35] caufman [2. Свойства объекта] |
bb:redbook:208 [2020/10/29 07:08] (текущий) |
||
---|---|---|---|
Строка 49: | Строка 49: | ||
==== 3. Методы объекта ==== | ==== 3. Методы объекта ==== | ||
Как уже было упомянуто, | Как уже было упомянуто, | ||
- | + | PROCEDURE (VAR p: tPerson) Accum* (m: REAL), NEW; | |
- | + | | |
+ | p.count := p.count + m; | ||
+ | Log.Real(p.count); | ||
+ | END Accum; | ||
Этот метод (процедура специального вида) принимает параметр (VAR self: tPerson) в качестве скрытой ссылки. В последствие, | Этот метод (процедура специального вида) принимает параметр (VAR self: tPerson) в качестве скрытой ссылки. В последствие, | ||
C начислением всё в порядке. Давайте теперь немного денег потратим: | C начислением всё в порядке. Давайте теперь немного денег потратим: | ||
- | + | PROCEDURE (VAR p: tPerson) Debet* (m: REAL), NEW; | |
- | + | | |
+ | p.count := p.count - m; | ||
+ | Log.Real(p.count); | ||
+ | END Debet; | ||
По аналогии с предыдущим методом здесь происходит получение скрытой ссылки на объект типа tPerson и вычитание указанной суммы со счёта. В обоих методах скрывается существенная ошибка, | По аналогии с предыдущим методом здесь происходит получение скрытой ссылки на объект типа tPerson и вычитание указанной суммы со счёта. В обоих методах скрывается существенная ошибка, | ||
- | + | PROCEDURE Start*; | |
- | + | BEGIN | |
- | + | | |
+ | anonim.Debet(60) | ||
+ | END Start; | ||
+ | |||
+ | компилируется " | ||
+ | Start теперь в символьном файле | ||
+ | старый модуль TestPerson выгружен | ||
+ | 50.0 | ||
+ | -10.0 | ||
Списано денег больше, | Списано денег больше, | ||
Полный текст программы представлен ниже: | Полный текст программы представлен ниже: | ||
- | + | MODULE TestPerson; | |
+ | (* модуль описывает объект банковского учёта *) | ||
+ | |||
+ | IMPORT Log; | ||
+ | |||
+ | TYPE | ||
+ | tPerson = RECORD (* объект человек *) | ||
+ | name-: ARRAY 128 OF CHAR; (* имя *) | ||
+ | family-: ARRAY 128 OF CHAR; (* фамилия *) | ||
+ | age: SHORTINT; (* возраст *) | ||
+ | id-: INTEGER; (* уникальный идентификатор *) | ||
+ | subset-: INTEGER; (* счёт в банке *) | ||
+ | count: REAL (* сколько денег на счёте *) | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | anonim*: tPerson; | ||
+ | |||
+ | PROCEDURE (VAR p: tPerson) Accum* (m: REAL), NEW; | ||
+ | BEGIN | ||
+ | p.count := p.count + m; | ||
+ | Log.Real(p.count); | ||
+ | END Accum; | ||
+ | |||
+ | PROCEDURE (VAR p: tPerson) Debet* (m: REAL), NEW; | ||
+ | BEGIN | ||
+ | p.count := p.count - m; | ||
+ | Log.Real(p.count); | ||
+ | END Debet; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | BEGIN | ||
+ | anonim.Accum(50); | ||
+ | anonim.Debet(60) | ||
+ | END Start; | ||
+ | |||
+ | BEGIN | ||
+ | END TestPerson. | ||
+ | |||
+ | (!)TestPerson.Start | ||
В приведённом коде всё ещё сохраняется ошибка со списанием денег. Решить эту проблему предлагается самостоятельно в качестве задания. | В приведённом коде всё ещё сохраняется ошибка со списанием денег. Решить эту проблему предлагается самостоятельно в качестве задания. | ||
[↑] | [↑] |