Несмотря на мои предпочтения в сторону языка Ада, эту страницу я постарался сделать как можно более информативной, объективной и как можно менее идеологизированной. Оформлено в виде таблицы. Каждый раз, как я смотрю на какой–то новый язык, разработчики подсовывают на видное место какие–то одни фичи, в то время, как меня волнуют совсем другие, и эти другие надо искать где–то в мануалах. Так как фичи выписаны в таблице, если что–то для одного языка является важным, с некоторой вероятностью всплывёт в этой таблице, а, значит, и в других языках. Таблицу пополняю в свободное время.
Delphi | C++ | Ada | |
---|---|---|---|
Объявление (некопируемого) класса | type TNewClass = class // ... end; | class new_class { // ... private: new_class(const new_class& source) { } } | type New_Class is limited tagged record -- ... end record; |
Инициализация полей конструктором по умолчанию | type TNewClass = class // ... public FBar: Integer; constructor Create; end; // ... constructor TNewClass.Create; begin inherited Create; FBar := 2; end; | class new_class { // ... public: int bar; new_class() : bar(2) { } private: new_class(const new_class& source) { } } | type New_Class is limited tagged record Bar : Integer := 2; end record; |
То же самое, но поле приватное | type TNewClass = class // ... private FBar: Integer; public constructor Create; end; // ... constructor TNewClass.Create; begin inherited Create; FBar := 2; end; | class new_class { // ... private: int bar; public: new_class() : bar(2) { } private: new_class(const new_class& source) { } } | type New_Class is limited tagged private; -- ... private -- приватная часть спецификации пакета -- ... type New_Class is limited tagged record Bar : Integer := 2; end record; В языке Ада контроль видимости не в типах, а в модулях. В частности, сделать одно поле видимым, а другое приватным возможно, только если отнаследовать дважды. Однако, примитивные операции могут быть частично публичными, частично приватными. Кроме того, родительский пакет может предоставлять не все операции с объектом сразу. Дочерние пакеты, имея доступ к внутреннему представлению могут предоставлять дополнительные операции. Например, Ada.Text_IO.Streams позволяет воспринимать открытые текстовые файлы как бинарные потоки. |
Инициализация и гарантированное уничтожение | var sl: TStringList; // ... sl := TStringList.Create; try // ... finally FreeAndNil(sl); end; Используя интерфейсы или варианты, можно и покороче, аналогично другим языкам | { vector<string> sl; // ... } | declare s : VectorOfStrings; begin -- ... end; |
Перегрузка операторов | Только, используя варианты или record | К любому типу, кроме тех, для которых объявлены операции по стандарту | К любому типу, так же, как и другие функции. |