Здравствуйте, DarkGray, Вы писали (
http://www.rsdn.ru/Forum/Message.aspx?mid=762929&only=1):Автор: DarkGray
Дата: 13.08.04
DG>Имхо, хорошая статическая типизация — это такая типизация, в которой можно по-максимуму задать ограничения на этапе компиляция.
DG>Замечу, что текущие языки не умеют "работать" даже с базовыми вещами.
DG>Пример 1:
DG>Определить функцию, которая принимает объект, который должен поддерживать и интерфейс IA, и интерфейс IB.
DG>Такое ограничение можно записать только с помощью generic-ов:
DG>DG>void Method<T>(T value) where T:IA, IB {}
DG>
DG>Пример 2:
DG>Определить функцию, которая принимает объект, или типа C1, или типа C2.
DG>Такой пример даже с помощью generic-ов не записывается.
В Оберонах это есть. Вот, например, в Active Oberon for .NET
VAR x: OBJET;
y: OBJECT{D};
x — переменная, которая может обозначать любой объект.
y — переменная, которая может обозначать любой объект реализующий интерфейс D. (Точнее не интерфейс, а
DEFINITION — это нечто более крутое чем интерфейс, но в частном случае, может рассматриваться как интерфейс.)
PROCEDURE DoSmth(VAR x: OBJECT; VAR y: OBJECT{D, E});
У процедуры DoSmth первый аргумент x — любой объект; второй аргумент y — любой объект реализующий интерфейсы D и E одновременно.
"Приведение типов":
IF x IMPLEMENTS D THEN D(x).f(); ... END;
http://www.oberon.ethz.ch/oberon.net/whitepaper/