Цитата:
То есть, если я правильно понял, вы считаете что без наличия у типа INTEGER(или любого другого базового) метода ToString() работать с типом нельзя? Это уже патология, имхо.
Это цитата Петра Кушнира, однако, так как он решил уйти от дальнейшего обсуждения, обойдёмся без него.
однако тема так и не раскрыта полностью. Alexey_Donskoy пытался донести эту мысль, с которой я согласен, до оберонщиков, увы, мимо... Попробую я тоже...
Предположим, есть задача -- иметь некий способ производить логически одинаковое действие над совершенно разными сущностями, будь то число, булево значение, символ, строка, массив, список, запись, таблица база данных, объект, расписание поездов, траектория полёта космического корабля по просторам Большого Театра, всё что угодно, в-общем.
Лично я знаю несколько способов, как делать эти действия. Перечислю их:
1) Путь ООП: создаём иерархию типов, в которой корневой тип (класс Object, например) имеет метод ToString() (в данном конкретном обсуждении).
Этот подход является сейчас очень распространённым в мэйнстриме (.NET, Java). Тем не менее, это довольно старый подход, известный ещё во времена Смоллтока, а может быть даже и Симулы-67 (не имею точной информации, но там это было бы вполне возможно).
Здесь всё является объектом -- и космический корабль, и простой байт.
x.ToString() -- образец перегрузочного полиморфизма в стиле ООП.
2) Путь современного ФП: создаём класс типов Show с методом show (упрощённо можно это назвать интерфейсом как в Яве, С# или там в Дельфях, так что это вполне может показаться допустимым способом и для ООП).
Для каждого нужного типа создаём экземпляр этого класса Show (а вот тут уже появляется различие между классами типов и интерфейсами. Экземпляры классов типов не привязаны к объявлению самих этих типов, в отличии от интерфейсов, т.е. в новые классы типов можно включать старые типы без их переписывания и вапще даже без доступа к их исходникам).
show x -- образец перегрузочного полиморфизма в стиле ФП.
3) Путь Ады и С++: создаём перегруженные функции/процедуры, которые не имеют никакой систематизации и внутренней логики и объединены лишь общим именем, но могут иметь совершенно разные параметры, в том числе и разное количество параметров...
Довольно гибкий способ, но, на мой взгляд, не самый безопасный и удобный в долговременной перспективе, о которой так пекутся оберонщики...
С одной стороны, он позволяет больше свободы, по сравнению с классами типов или иерархией типов, с другой стороны, как-то ощущается потеря контроля над этими функциями, не хватает некоторой дисциплины... :о(
(На самом деле, в том же C# объединены и первый, и третий способы.)
4) Ну, и наконец, путь таких языков, как Си, Паскаль, Модула-2...
Создаём зиллион разных функций для всех нужных нам типов, все они имеют разные имена вроде intToString, longToString, byteToString, ulongToString, boolToString, charToString, record1ToString, record2ToString, typeXXXToString, и т.д. и т.п.
Оберон предлагает совместить этот способ с первым, т.е. для каких-то там условно говоря "базовых" типов создавать туеву хучу разноимённых функций для одного и того же действия, а для расширяемых записей -- перегруженный метод ToString().
Позволю себе некоторые выводы.
Для меня лично нет особой разницы при использовании первого или второго способа, в общем-то, между x.ToString() и show x разница лишь синтаксическая, но вот при создании этих перегруженных функций мне больше нравится второй способ (хотя у него есть и свои достоинства, и свои недостатки по сравнению с первым).
Общее достоинство первых двух способов -- экономия понятий, которыми придётся оперировать пользователям этих функций -- для одного и того же действия одно и то же название.
Третий способ мне не нравится -- как-то не очень надёжным мне он кажется...
Четвёртый способ, особенно в исполнении оберонов, мне кажется абсолютно неприемлемым.
Оберонщики скажут -- нужно типа знать меру, диалектику природы уважать и всё такое, но по-моему, это просто лукавство.
Будьте последовательными, чёрт возьми! Что за такая вечная двойная логика, двойные стандарты? Не верю я вам!!! :-х