Как реализовано наследование в Аде и есть ли у него встроенный графический интерфейс?

Поставляется ли Ada со встроенным графическим интерфейсом и имеет ли она тот же уникальный подход к наследованию, что и Oberon?


person W.K.S    schedule 27.08.2011    source источник
comment
К сведению читателей: Эрих изначально задал этот вопрос в комментарии к вопросу stackoverflow.com/questions/7182968/ и любезно разместил его здесь по моему настоянию. Если вас в первую очередь интересует Оберон, вам также следует проверить этот вопрос.   -  person T.E.D.    schedule 29.08.2011


Ответы (3)


Нет, у Ады нет встроенного графического интерфейса; но тогда ближайший язык, о котором я могу думать, это PostScript. (Технически язык Java этого не делает, хотя включенная в него библиотека делает это.) При этом есть привязка GTK (которую я вообще не использовал) и привязка OpenGL (с которой я только играл; и чтобы честно говоря, привязка OpenGL намного тоньше, чем мне бы хотелось).

Модель наследования Оберона (насколько я понимаю) представляет собой наследование с одним расширением, такое же, как у Ады; хотя Ада включает в себя интерфейсную систему, похожую на Java. На самом деле я не использовал Oberon, поэтому я не могу предоставить вам параллельные примеры для них двух, но могу показать вам пример Ады.

База:

Type Base is Abstract Tagged Record
   Null;
End Record; -- Base

-- Base Operations
Procedure Op( Object : In Out Base );
Procedure Dispatching_Op( Object : In Out Base'Class );

Расширение:

Type Extended is New Base With Record
  Null;
End Record; -- Extended

Overriding Procedure Op( Object : In Out Extended );

С телами, скажем:

  Procedure Op( Object : In Out Base ) is
  begin
     Put( "Hello" );
  end Op;

  Procedure Dispatching_Op( Object : In Out Base'Class ) is
  begin
     Op( Object );
     Put_Line( " World." );
  end Dispatching_Op;

  Procedure Op( Object : In Out Extended ) is
  begin
     Put( "Goodbye" );
  End Op;

Который с учетом объекта типа P {P : K.Base'Class:= K.Extended'(Others => ‹>);} можно было бы назвать так:

P.Dispatching_Op;

И даст следующие результаты в этом случае:

Goodbye World.
person Shark8    schedule 29.08.2011
comment
Самый распространенный стиль Ады — использование нижнего регистра для ключевых слов и смешанного регистра для идентификаторов. Например: procedure Op( Object : in out Base ); - person Keith Thompson; 29.08.2011
comment
...однако Ада не учитывает регистр, поэтому ничего принудительного этого не требует. (Отсюда использование Китом слова стиль) - person T.E.D.; 29.08.2011
comment
Я люблю нечувствительность к регистру; нет веской причины, по которой язык программирования должен задыхаться, потому что я слишком долго удерживаю клавишу Shift (или недостаточно долго)... на самом деле, если стиль так важен, нет причин, по которым сам компилятор нельзя кооптировать, чтобы поместить источник в этот стиль. - person Shark8; 29.08.2011
comment
...которым компилятор Gnat может быть. Но это, конечно, другой вопрос. stackoverflow.com/questions/6430204/ - person T.E.D.; 30.08.2011
comment
Разве это не для того, чтобы выбрасывать ошибки в плохих стилях, а не просто брать код и переформатировать его в правильный стиль? - person Shark8; 30.08.2011
comment
Вы можете сделать и то, и другое: использовать gnatpp для переформатирования исходного кода или настроить параметры стиля для вашего проекта и добавить переключатели компилятора, чтобы применить свой собственный стиль. Прежде чем публиковать код на таких сайтах, как rosettacode, я обычно запускаю его через gnatpp и сравниваю с оригиналом. Некоторые изменения не нужны, но другие того стоят. - person Rommudoh; 30.08.2011
comment
@oenone -- спасибо за подсказку; это может пригодиться. - person Shark8; 31.08.2011

Немногие языки программирования предоставляют встроенный графический интерфейс, если под этим вы подразумеваете, что примитивы графического интерфейса являются неотъемлемой частью самого языка программирования. Ада может использовать наборы инструментов GUI, как и другие языки. Среди готовых к использованию с Ada — GtkAda и QtAda. А RAPID — это конструктор интерфейсов, специально разработанный для создания пользовательских интерфейсов приложений на языке Ada.

Я не могу говорить о подходе Оберона к наследованию, но в Ada WikiBook есть хорошее описание подхода Ады к ориентация объекта.

person Marc C    schedule 27.08.2011
comment
См. также этот Вопросы и ответы. - person trashgod; 27.08.2011

Не так много языков программирования имеют графический интерфейс. Оберон есть, но только потому, что на самом деле он поставляется с целой операционной системой (включая графический интерфейс этой ОС). У Java есть пара, но по той же причине (JVM - это, по сути, операционная система Java). В Delphi он есть, потому что Delphi — это, по сути, название Pascal в сочетании с определенным графическим интерфейсом.

Типичный язык программирования предназначен для выхода за рамки конкретной платформы, и поэтому большинство пользователей захотят использовать стандартный графический интерфейс на любой платформе (Windows, Linux и т. д.), над которой они работают. Ада — одна из них.

Это не означает, что не существует интегрированных сред, предназначенных для использования с Ada. Gnavi — это проект, пытающийся сделать что-то вроде Delphi, но с Ada и стандартной Windows. Графический интерфейс. GTKAda — это другой проект, который помогает программам на языке Ada создавать графические интерфейсы пользователя. с помощью набора инструментов для виджетов GTK+. GTK+ — это один из стандартных наборов инструментов с графическим интерфейсом, используемых в Linux (и переносимый в Windows).

Что касается наследования, то в последний раз, когда я играл с Oberon, мне казалось, что он использует простое наследование расширений на основе типов записей. Такого же подхода придерживается и Ада. Однако метод диспетчеризации Ады находится где-то на полпути между тем, что делает Oberon, и тем, что делает C++. Механически он подобен Оберону. Единственное, что немного странно, это то, что подпрограммы привязаны к классу (записи) в силу того, что этот класс используется в качестве параметра и определяется в том же пакете, что и класс, а не явно с помощью какое-то ключевое слово. В противном случае это будет выглядеть очень похоже.

Но я считаю, что в Обероне все переопределяющие методы являются динамической диспетчеризацией, тогда как Ада использует динамическую диспетчеризацию только тогда, когда это требуется из-за использования общеклассовых указателей или ссылок, как это делает C++. Если это не относится к вашему объектно-ориентированному вопросу, вам, возможно, придется уточнить, что именно в объектно-ориентированной системе Оберона вас интересует.

person T.E.D.    schedule 29.08.2011
comment
В Oberon можно использовать как статическую, так и динамическую диспетчеризацию. На самом деле, строго говоря, Оберон фактически не предоставляет никакого механизма диспетчеризации, но вы можете легко запрограммировать его самостоятельно. Вирт приводит примеры статической и динамической диспетчеризации в книге «Программирование в Обероне». Он утверждает, что статическая диспетчеризация полезна для методов, известных как универсальные и добавленных к базовому типу, в то время как динамическая диспетчеризация предназначена для всего остального. Основной мотив, по-видимому, заключается в том, чтобы избежать проблемы хрупкости базового класса, которая так распространена во многих языках ООП. - person trijezdci; 28.10.2015