Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
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 | ||
| В приведённом коде всё ещё сохраняется ошибка со списанием денег. Решить эту проблему предлагается самостоятельно в качестве задания. | В приведённом коде всё ещё сохраняется ошибка со списанием денег. Решить эту проблему предлагается самостоятельно в качестве задания. | ||
| [↑] | [↑] | ||