Сравнение языков программирования (esyr) (1161143), страница 5
Текст из файла (страница 5)
Это всё, что после begin.package body Points isprocedure setToZero(point: in out Point) isbeginpoint := zero;end setToZero;function dotProduct(point1: in Point; point2: in Point) return Integer isbeginreturn point1.x * point2.x + point1.y * point2.y;end setToZero;beginAda.Text_IO.Put_Line("Package ready!");end Points;Пакеты можно расширять. Взять и определить пакет Points.RandomDistributions, в нём можно пользоваться всем, что объявлено в пакете-родителе.
Пакет можносделать недоступным вне своей иерархии.private package Points.internalThing is<...>При подключении потомка родитель-пакет подключается автоматически.О подключениях. Подключить пакет можно с помощ ью конструкции with.with Points.RandomDistributions;После этого можно будет пользоваться ввсем, что в пакете лежит, через точечную нотацию. Если же вызовов слишком много, то можно влить содержимое пакетав текущ ую область видимости с помощ ью use (только после подключения!).use Points.RandomDistributions;В случае конфликтов имён придётся-таки предварять каждое обращ ение именем пакета.ОБЕРОН И ОБЕРОН-2[править]В Обероне-2 стандартная процедура NEW используется, чтобы распределить блоки данных в свободной памяти. Нет, однако, никакого способа явно освободитьраспределенный блок.
Взамен Оберон-среда использует сборщ ик мусора чтобы найти блоки, которые больше не используются и сделать их снова доступнымидля распределения.Расширение типовНаиболее важным добавлением(от-но Modula-2) является механизм расширенных типов записи. Он позволяет конструировать новые типы на основе ужесущ ествующ их и задает определенную степень совместимости между новыми и старыми типами. Предположим, что у нас имеется типT = RECORD x,y: INTEGER ENDopen in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comВ дополнение к сущ ествующ им полям могут быть заданы новые:T0 = RECORD (T) z: REAL ENDT1 = RECORD (T) w: LONGREAL ENDЗдесь определяются типы с полями x,y,z и x,y,w соответственно. Мы говорим, что тип T’T’ = RECORD (T) <описание_полей> ENDявляется (прямым) расширением типа T, и наоборот, T называется (прямым) базовым (base) типом для T’.Modula-2[править]Перечислимый тип[править]TYPE DaysOfWeek = (sunday, monday, tuesday, wednesday, thursday, friday, saturday);(* тогда ORD(friday) = 5, MAX(DaysOfWeek) = saturday *)Тип поддиапазон[править]TYPE SubType = [min ..
max];Дополнительно можно указывать хостовой типTYPESubType1 = [0..7]; (* host type is CARDINAL *)SubType2 = INTEGER [0..7]; (* host type is INTEGER *)WeekDays = [mon .. fri]; (* host type is DaysOfWeek *)Говорят, что тип Т1 совместим с типом Т0, если либо он описан как Т1 = Т0, либо как диапазон Т0, либо если Т0 является диапазоном Т1, либо если и Т0, и Т1 оба диапазоны одного и того же (базового) типа.Записи[править]Как в Паскале.TYPEmyRec = RECORDval1: type1;valn: typen;END;Namespace в C#[править]Ключевое слово namespace используется для объявления области, которая содержит набор связанных объектов. Можно использовать пространство имён дляорганизации элементов кода, а также для создания глобально уникальных типов.namespace SampleNamespace{open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com{class SampleClass { }interface SampleInterface { }struct SampleStruct { }enum SampleEnum { a, b }delegate void SampleDelegate(int i);}namespace SampleNamespace.Nested{class SampleClass2 { }}Классы[править]Конструкторы[править]Обычно выделяют следующ ие типы конструкторов: конструктор по умолчанию, конструктор копирования и конструктор преобразования.
Конструкторы имеютпользовательскую (тело объявленного конструктора) и системную (сгенерированный код) части.Деструкторы и финализаторы[править]Деструкторы и финализаторы — это специальные функции-члены класса, автоматически вызываемые при уничтожении объекта класса. Роль деструкторов ифинализаторов — освобождение захваченных объектом ресурсов. Если объект не захватывает ресурсы или ресурсы освобождаются автоматически, то нужды вдеструкторе (финализаторе) нет. Деструкторы не имеют параметров. В языке Java деструкторов нет, их роль (до определенной степени) играет метод void finalize()— финализатор.
В языке C# формально деструкторы есть, однако их поведение аналогично поведению финализаторов в языке Java. Деструкторы в C++отличаются от финализаторов в Java и C# тем, что в C++ можно достаточно точно установить момент вызова деструктора.1. Деструкторы статических объектов вызываются после выхода из функции main.2. Деструкторы квазистатических объектов выполняются при выходе из блока.
Причём, деструкторы вызываются строго в обратном порядке относительнопорядка вызова конструкторов квазистатических объектов данного блока.3. Деструкторы динамических объектов выполняются при вызове операции delete.4. Деструкторы временных объектов выполняются при выходе из конструкции, в контексте которой был создан объект.В Java и C# время вызова финализатора не определено из-за наличия сборщ ика мусора. Как и конструкторы, деструкторы имеют пользовательскую и системнуючасти.Неявные контрукторы/деструкторы/операции в C++[править]Следующ ие элементы класса могут быть определены неявно:Конструктор по умолчанию (если нет ни одного явно определённого конструктора).Конструктор копирования (если конструктор копирования не описан явно).
Осущ ествляет т.н. поверхностное копирование полей класса (бит в бит).Деструктор (если деструктор не описан явно). Вызывает деструкторы объектов-полей (не полей-указателей!).Операция присваивания (если не определена явно). Записывает значения полей объекта-аргумента в целевой объект (тоже поверхностное копирование),возвращ ает ссылку на целевой объект.Фишки:Запрет копирования объекта: определить конструктор копирования в приватной части класса.Запрет создания экземпляровобъекта — глобальных и локальных переменных, иначе говоря данные запрещ ено размещ ать в секциях .data/.bss и на стеке,open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comразрешено только в динамической памяти.
Нужно определить декструктор в приватной части класса. Освобождение ресурсов объекта при таком подходеосущ ествляется через метод данного класса.Запрет присваивания одного объекта другому: определение операции присваивания в приватную часть класса.Запрет неявного вызова конструктора копирования, конструктора преобразования (иначе говоря, конструкторов с одним параметром) или операциипреобразования (последнее — только в C++11). Нужно добавить в начало заголовка ключевое слово explicit.Свойства[править]В C# и Delphi есть поддержка свойств (property).Свойство - способ доступа к внутреннему состоянию объекта, имитирующ ий переменную некоторого типа.
Обращ ение к свойству объекта выглядит так же, как иобращ ение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значениеданного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью (открытого) интерфейса, позволяют менять внутреннюю реализациюобъекта без изменения его свойств. Свойства предназначены для того, чтобы свести программирование к операциям над свойствами, скрывая вызовы методов.Свойства в C# — поля с логическим блоком, в котором есть ключевые слова get и set.class MyClass{private int p_field;public int Field{get{return p_field;}private set{p_field = value;}}}Для описания свойства в Delphi служит слово property.TMyClass = classprivateFMyField: Integer;procedure SetMyField(const Value: Integer);function GetMyField: Integer;publicproperty MyField: Integer read GetMyField write SetMyField;end;function TMyClass.GetMyField: Integer;beginResult := FMyField;end;procedure TMyClass.SetMyField(const Value: Integer);beginFMyField := Value;end;Статические классыopen in browser PRO[править]Статический класс — это, в общ ем случае, достаточно неформальное понятие.
Обычно так называют класс, все члены которого объявлены статическими. Дляработы с таким классом не требуется создавать экземпляр и часто, говоря о статическом классе, подразумевают невозможность создания экземпляра. Такойversion Are you a developer? Try out the HTML to PDF APIpdfcrowd.comкласс, как правило, не имеет конструкторов и деструкторов, либо они объявлены приватными (в зависимости от языка).[6]Иногда понятие статического класса закрепляется на уровне языка программирования. В этом случае язык добавляет некоторые требования, кроме статичностивсех членов и невозможности создания экземпляров: например, невозможность наследования от данного класса или невозможность реализации таким классоминтерфейса (см.
далее про C#).Следует понимать, что в контексте разных языков программирования могут подразумеваться разные понятия статического класса, разной степени формальности(вплоть до строго закреплённого языком понятия).В C++[править]В C++ понятие статического класса отсутствует. Для реализации статического класса нужно объявить члены класса статическими (static) и запретить создание егоэкземпляров, поместив конструктор по умолчанию и конструктор копирования в приватную (private) часть класса (а по-хорошему, ещ ё и деструктор). Похожихсвойств можно добиться, используя шаблон проектирования singleton — для класса-singleton'а будет сущ ествовать ровно один экземпляр данного класса.В Java[править]В Java также нет понятия соответствующ его статическому классу в данном выше понимании (статические вложенные классы — совершенно другая вещ ь, о нихдалее в этом разделе). Ситуация аналогична ситуации в C++. Для реализации статического класса нужно объявить все члены статическими (static) и запретитьсоздание его экземпляров, объявив конструктор приватным (private).