A2 & Oberon » Программирование » ActiveOberon » Перегрузка процедур

Страниц (2): [1] 2 »
 

1. sage - 04 Декабря, 2008 - 08:41:33 - перейти к сообщению
С удивлением обнаружил, что перегрузка процедур присутствует в языке А?!
А порой очень не хватало...
MODULE Overloading {OVERLOADING};

IMPORT
Commands;

PROCEDURE p1(i: INTEGER): INTEGER;
BEGIN
RETURN i + 10
END p1;

PROCEDURE p1(l: LONGINT): LONGINT;
BEGIN
RETURN l + 20
END p1;

PROCEDURE Test*(con: Commands.Context);
VAR
i: INTEGER;
l: LONGINT;
BEGIN
i := 1;
l := 2;
con.out.String('i = '); con.out.Int(p1(i), 0); con.out.Ln;
con.out.String('l = '); con.out.Int(p1(l), 0); con.out.Ln;
END Test;

END Overloading.Test ~
В лог выведется:
Цитата:
i = 11
l = 22
Следовательно, работает Хорошо
ЗЫ. Я попробовал только с процедурами...
Судя по коментарию к флагу:
Overloading* = 31;	(**Modules only: duplicate entries allowed (applies to all scopes in the module)*)
... любые дубли возможны в пределах модуля. Трудно даже вообразить, что ещё можно перегрузить Не понял
2. lit-uriy - 04 Декабря, 2008 - 10:32:05 - перейти к сообщению
sage пишет:
С удивлением обнаружил, что перегрузка процедур присутствует в языке
дак это вроде еще в О-2 сделано, конструкторы перегруженные в О-2 применялись.
Я вот только про перегрузку операторов не знал.
3. sage - 04 Декабря, 2008 - 10:55:37 - перейти к сообщению
lit-uriy пишет:
дак это вроде еще в О-2 сделано
Вообще-то по-умолчанию перегрузка процедур запрещена, нужен флажок {OVERLOADING}. Только вот, поиск по исходникам A2 показал, что это нигде не используется.
lit-uriy пишет:
конструкторы перегруженные в О-2 применялись.
Хорошая идея Подмигивание
4. lit-uriy - 10 Января, 2009 - 09:58:51 - перейти к сообщению
sage пишет:
Хорошая идея
похоже перегруженый конструктор нельзя создать:
Огорчение
5. sage - 10 Января, 2009 - 13:27:58 - перейти к сообщению
lit-uriy пишет:
похоже перегруженый конструктор нельзя создать:
Огорчение
Да, конструктор может быть только один... Флаг {OVERLOADING} тут не работает.
Но нам ничего не мешает определить новый конструктор у наследника под другим именем и с другими параметрами (имя конструктора похоже вообще не играет роли, главное значёк &, и чтобы оно было другим если будет другой набор параметров), а потом самим решить вызывать конструктор предка или нет Подмигивание
MODULE Untitled;

IMPORT
Commands;

TYPE

obj1 = OBJECT
VAR
n: INTEGER;

PROCEDURE &New1;
BEGIN
n := 1000
END New1;

END obj1;

obj2 = OBJECT (obj1)

PROCEDURE &New2(iValue: INTEGER);
BEGIN
New1;
n := iValue
END New2;

END obj2;

PROCEDURE Test*(con: Commands.Context);
VAR
o1: obj1;
o2: obj2;
BEGIN
NEW(o1);
NEW(o2, 100);
con.out.Int(o1.n, 0); con.out.Ln;
con.out.Int(o2.n, 0); con.out.Ln
END Test;

END Untitled.Test ~

SystemTools.Free Untitled ~


ЗЫ. Хотя то что не сработал флаг {OVERLOADING} может и не правильно в данном случае... баг? Ниндзя
6. lit-uriy - 10 Января, 2009 - 13:59:08 - перейти к сообщению
sage пишет:
у наследника
sage пишет:
вызывать конструктор предка или нет
да мне конструктор предка ни к чему.
7. sage - 10 Января, 2009 - 14:41:35 - перейти к сообщению
Похоже трапается даже при попытке перегрузить обычный метод (не конструктор). Так что тут высока вероятность того, что это всё-же баг... Эх, было-бы это немножко больше документированным...

ЗЫ. Можно попытаться запостить на OCP как баг, может исправят.
8. lit-uriy - 10 Января, 2009 - 14:45:55 - перейти к сообщению
sageможет ты так и сделаешь, а то я с аглицким только в одну сторону дружу.
9. BohdanT - 10 Января, 2009 - 14:56:02 - перейти к сообщению
sage пишет:
Похоже трапается даже при попытке перегрузить обычный метод (не конструктор).

А можно пример с трапом?
10. sage - 10 Января, 2009 - 15:06:08 - перейти к сообщению
Трапается даже если добавить {OVERLOADING} к предыдущему примеру с друмя объектами.
Т.е. при заданном флаге и без каких либо перегрузок:
MODULE Untitled {OVERLOADING};

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0089]     [ Gzipped ]