Конструктор (объектно-ориентированное программирование)

редактировать

В классовом объектно-ориентированном программировании конструктор (сокращение: ctor ) - это специальный тип подпрограммы, вызываемой для создания объекта. Он подготавливает новый объект к использованию, часто принимая аргументы, которые конструктор использует для установки требуемых переменных-членов.

Конструктор похож на метод экземпляра , но отличается от в том, что он не имеет явного возвращаемого типа, не является неявно унаследованным и обычно имеет другие правила для модификаторов области. Конструкторы часто имеют то же имя, что и объявленный класс . У них есть задача инициализировать элементы данных объекта и установить инвариант класса, который не выполняется, если инвариант недействителен. Правильно написанный конструктор оставляет результирующий объект в допустимом состоянии. Неизменяемые объекты должны быть инициализированы в конструкторе.

Большинство языков позволяют перегрузить конструктор, поскольку для класса может быть несколько конструкторов с разными параметрами. Некоторые языки учитывают некоторые особые типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возврата нового экземпляра класса, абстрагируются фабриками, которые также создают объекты, но могут делать это разными способами, используя несколько классов или разные схемы распределения. например, пул объектов .

Содержание

  • 1 Типы
    • 1.1 Параметризованные конструкторы
    • 1.2 Конструкторы по умолчанию
    • 1.3 Копирующие конструкторы
    • 1.4 Конструкторы преобразования
    • 1.5 Конструкторы перемещения
  • 2 Синтаксис
  • 3 Организация памяти
  • 4 Сведения о языке
    • 4.1 Java
    • 4.2 JavaScript
    • 4.3 Visual Basic.NET
    • 4.4 C #
      • 4.4.1 Статический конструктор C #
    • 4.5 C ++
    • 4.6 F #
    • 4.7 Eiffel
    • 4.8 CFML
    • 4.9 Object Pascal
    • 4.10 Perl 5
    • 4.11 Perl 5 с Moose
    • 4.12 Raku
    • 4.13 PHP
    • 4.14 Python
    • 4.15 Ruby
    • 4.16 OCaml
  • 5 См. Также
  • 6 Примечания
  • 7 Ссылки

Типы

Параметризованные конструкторы

Конструкторы, которые могут принимать по крайней мере один аргумент называется параметризованным конструктором. Когда объект объявляется в параметризованном конструкторе, начальные значения должны быть переданы в качестве аргументов функции конструктора. Обычный способ объявления объекта может не работать. Конструкторы могут вызываться явно или неявно. Метод неявного вызова конструктора также называется сокращенным методом. Если мы хотим инициализировать поля класса вашими собственными значениями, используйте параметризованный конструктор.

class Example {public: Example (); Пример (int a, int b); // Параметризованный конструктор. частный: int x_; int y_; }; Пример :: Пример () = по умолчанию; Example :: Example (int x, int y): x_ (x), y_ (
Example e = Example (0, 50); // Явный вызов. Пример e2 (0, 50); // Неявный вызов.

Конструкторы по умолчанию

Если программист не предоставляет конструктор для экземпляра класса, компилятор Java вставляет конструктор по умолчанию в ваш код от вашего имени. Этот конструктор известен как конструктор по умолчанию. Вы не найдете его в исходном коде (файле java), поскольку он будет вставлен в код во время компиляции и существует в файле.class. Поведение конструктора по умолчанию зависит от языка. Он может инициализировать элементы данных равными нулю или другие те же значения, или он может вообще ничего не делать. В Java «конструктор по умолчанию» относится к конструктору с нулевым значением, который автоматически создается компилятором, если для класса не определены конструкторы или в отсутствие какого-либо определенного программиста конструкторы (например, в Java конструктор по умолчанию неявно вызывает нулевой конструктор суперкласса, затем выполняет em pty body). Для всех полей остается исходное значение 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false (логический тип) или null (ссылочные типы).

#include class Student {public: Student (int a = 0, int b = 0); // Конструктор по умолчанию. int a; int b; };

Конструкторы копирования

Подобно C ++, Java также поддерживает «Конструктор копирования». Но, в отличие от C ++, Java не создает конструктор копирования по умолчанию, если вы не пишете свой собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. У конструктора Copy есть один формальный параметр, который является типом класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Несмотря на то, что оба класса одинаковы, он считается конструктором преобразования. Хотя конструкторы копирования обычно сокращенно называются ctor или cctor, они не имеют ничего общего с конструкторами классов, используемыми в.NET с использованием того же сокращения.

Конструкторы преобразования

Конструкторы преобразования предоставляют компилятору средство неявно создавать объект, принадлежащий одному классу, на основе объекта другого типа. Эти конструкторы обычно вызываются неявно для преобразования аргументов или операндов в соответствующий тип, но они также могут вызываться явно.

Конструкторы перемещения

В C ++ конструкторы перемещения принимают ссылку на значение объекта класса и используются для реализации передачи владения ресурсами объекта параметра.

Синтаксис

  • Java, C ++, C#, ActionScript, PHP 4 и MATLAB имеют соглашение об именах, в котором конструкторы имеют то же имя, что и класс, с которым они связаны.
  • В PHP 5 рекомендуемое имя для конструктора - __construct. Для обратной совместимости будет вызван метод с тем же именем, что и у класса, если метод __constructне может быть найден. Начиная с PHP 5.3.3, это работает только для классов без пространства имен.
  • В PHP 7 вы всегда должны называть конструктор как __construct. Методы с тем же именем, что и класс, вызовут ошибку уровня E_DEPRECATED.
  • В Perl конструкторы, по соглашению, называются «новыми» и должны выполнять значительный объем создания объектов..
  • В объектной системе Moose для Perl конструкторы (с именем new) создаются автоматически и расширяются путем указания метода BUILD.
  • В Visual Basic. NET, конструктор называется «New".
  • . В Python конструктор разделен на два метода:« __new__»и« __init __". Метод __new__отвечает за выделение памяти для экземпляра и принимает класс в качестве аргумента (условно называется" cls"). __init __метод (часто называемый «инициализатором») передается вновь созданному экземпляру в качестве аргумента (обычно называется «self»).
  • Конструкторы Object Pascal обозначаются ключевым словом «конструктор"и может иметь пользовательские имена (но чаще всего называются" Create").
  • В Objective-C метод конструктора разделен на два метода:« alloc»и« init"с методом alloc, выделяющим (выделяя) память для экземпляра класса, и методом init, обрабатывающим основную часть инициализации экземпляра. Вызов метода «new» вызывает оба метода allocи initдля экземпляра класса.

Организация памяти

В Java, C # и VB.NET конструктор создает объекты ссылочного типа в специальной структуре памяти, называемой «куча ». Типы значений (такие как int, double и т. Д.) Создаются в последовательной структуре, называемой «stack ». VB.NET и C # также позволяют использовать новый оператор для создания объектов типа значения, но эти объекты типа значения создаются в стеке независимо от того, используется оператор или нет.

В C ++ объекты создаются в стеке, когда конструктор вызывается без оператора new, и создаются в куче, когда конструктор вызывается с оператором new. Объекты стека удаляются неявно, когда они выходят за пределы области видимости, в то время как объекты кучи должны быть удалены неявно с помощью деструктора или явно с помощью оператора удаления.

Сведения о языке

Java

В Java конструкторы отличаются от других методов тем, что:

  • Конструкторы никогда не имеют явного возвращаемого типа.
  • Конструкторы не могут быть вызваны напрямую (их вызывает ключевое слово «new»).
  • Конструкторы не могут быть синхронизированными, окончательными, абстрактными, собственными или статическими.
  • Он не должен содержать модификаторов.

Конструкторы Java выполняют следующие задачи в следующем порядке:

  1. Вызов конструктора суперкласса по умолчанию, если конструктор не определен.
  2. Инициализируют переменные-члены указанными значениями.
  3. Выполняет тело конструктора.

Java разрешает пользователям вызывать один конструктор в другом конструкторе с помощью ключевого слова this (). Но this ()должен быть первым оператором.

class Example {Example () // Непараметрический конструктор {this (1); // Вызов конструктора System.out.println ("0-arg-cons"); } Пример (int a) // Параметризованный конструктор {System.out.println ("1-arg-cons"); }} public static void main (String args) {Example e = new Example (); }

Java предоставляет доступ к конструктору суперкласса через ключевое слово super.

public class Example {// Определение конструктора. общедоступный Пример () {это (1); } // Перегрузка конструктора public Example (int input) {data = input; // Это присвоение} // Объявление переменной (ей) экземпляра. частные данные типа int; }
// Код в другом месте // Создание экземпляра объекта с помощью вышеуказанного конструктора Пример e = new Example (42);

Конструктор, принимающий нулевое количество аргументов, называется конструктором «без аргументов» или «без аргументов».

JavaScript

Начиная с ES6, JavaScript имеет прямые конструкторы, как и многие другие языки программирования. Они записываются как таковые

class FooBar {constructor (baz) {this.baz = baz}}

Это может быть создано как таковое

const foo = new FooBar ('7')

Эквивалент из этого до ES6 создавала функцию, которая создает экземпляр объекта как такового

function FooBar (baz) {this.baz = baz; }

Это создается так же, как указано выше.

Visual Basic.NET

В Visual Basic.NET конструкторы используют объявление метода с именем «New».

Класс Foobar Private strData As String 'Конструктор Public Sub New (ByVal someParam As String) strData = someParam End Sub End Class
' код где-то еще ', создающий экземпляр объекта с помощью вышеуказанного конструктора Dim foo As New Foobar (". NET ")

C #

Пример C # конструктор:

открытый класс MyClass {private int a; частная строка b; // Конструктор public MyClass (): this (42, "string") {} // Перегрузка конструктора public MyClass (int a, string b) {this.a = a; this.b = b; }}
// Код где-нибудь // Создание экземпляра объекта с помощью конструктора выше MyClass c = new MyClass (42, "string");

Статический конструктор C #

В C # статический конструктор является инициализатором статических данных. Статические конструкторы также называются конструкторами классов. Поскольку фактически сгенерированный метод имеет имя.cctor, их часто также называют «cctors».

Статические конструкторы позволяют инициализировать сложную статическую переменную. Статические конструкторы вызываются неявно при первом обращении к классу. Любой вызов класса (статический вызов или вызов конструктора) запускает выполнение статического конструктора. Статические конструкторы потокобезопасны и реализуют одноэлементный шаблон . При использовании в классе универсального программирования статические конструкторы вызываются при каждом новом создании универсального экземпляра, по одному для каждого типа. Также создаются статические переменные.

открытый класс MyClass {частный статический int _A; // Обычный конструктор static MyClass () {_A = 32; } // Стандартный конструктор по умолчанию public MyClass () {}}
// Код где-нибудь // Создание экземпляра объекта с помощью конструктора выше // прямо перед созданием // Выполняется статический конструктор переменной и _A равно 32 MyClass c = новый MyClass ();

C ++

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

Конструктор состоит из двух частей. Сначала идет список инициализаторов , который следует за списком параметров и перед телом метода. Он начинается с двоеточия, а записи разделяются запятыми. Список инициализаторов не требуется, но дает возможность предоставлять значения для элементов данных и избегать отдельных операторов присваивания. Список инициализаторов требуется, если у вас есть члены данных константного или ссылочного типа или члены, не имеющие логики конструктора без параметров. Присваивания выполняются в соответствии с порядком, в котором объявлены элементы данных (даже если порядок в списке инициализаторов отличается). Вторая часть - это тело, которое представляет собой обычное тело метода, заключенное в фигурные скобки.

C ++ позволяет использовать более одного конструктора. Остальные конструкторы должны иметь другие параметры. Кроме того, конструкторы, которые содержат параметры, которым заданы значения по умолчанию, должны придерживаться ограничения, согласно которому не всем параметрам присваиваются значения по умолчанию. Это ситуация, которая имеет значение только при наличии конструктора по умолчанию. Конструктор базового класса (или базовых классов) также может быть вызван производным классом. Функции-конструкторы не наследуются, и на их адреса нельзя ссылаться. Когда требуется выделение памяти, неявно вызываются операторы new и delete.

Конструктор копирования имеет параметр того же типа, что и ссылка на константу, например Vector (const Vector rhs). Если он не указан явно, компилятор использует конструктор копирования для каждой переменной-члена или просто копирует значения в случае примитивных типов. Реализация по умолчанию неэффективна, если класс имеет динамически выделяемые члены (или дескрипторы для других ресурсов), поскольку это может привести к двойным вызовам удаления (или двойному освобождению ресурсов) после уничтожения.

class Foobar {public: Foobar (double r = 1.0, double alpha = 0.0) // Конструктор, параметры со значениями по умолчанию. : x_ (r * cos (alpha)) // <- Initializer list { y_ = r * sin(alpha); // <- Normal assignment } private: double x_; double y_; };

Пример вызова:

Foobar a, b (3), c (5, M_PI / 4);

При возврате объектов из функций или передаче объектов по значению конструктор копирования объектов будет вызываться неявно, если не применяется оптимизация возвращаемого значения.

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

F #

В F # конструктор может включать любые letили doоператоров, определенных в классе. Операторы letопределяют частные поля, а операторы doвыполняют код. Дополнительные конструкторы можно определить с помощью ключевого слова new.

type MyClass (_a: int, _b: string) = class // Первичный конструктор let a = _a let b = _b do printfn "a =% i, b =% s" ab // Дополнительные конструкторы new (_a: int) = MyClass (_a, "") затем printfn "Задан целочисленный параметр" new (_b: string) = MyClass (0, _b) затем printfn "Задан строковый параметр" new () = MyClass (0, "") затем printfn «Параметр не указан» end
// Где-то код // создание экземпляра объекта с помощью основного конструктора let c1 = new MyClass (42, "string") // создание экземпляра объекта с дополнительными конструкторами let c2 = new MyClass (42) let c3 = new MyClass ("string") let c4 = MyClass () // ключевое слово "new" не обязательно

Eiffel

В Eiffel процедуры инициализации новых объектов называется процедурами создания. Процедуры создания имеют следующие особенности:

  • Процедуры создания не имеют явного типа возврата (по определению процедуры).
  • Процедуры создания имеют имена.
  • Процедуры создания обозначаются по имени как процедуры создания в тексте класса.
  • Процедуры создания могут быть явно вызваны для повторной инициализации существующих объектов.
  • Каждый эффективный (т.е. конкретный или не абстрактный) класс должен обозначать как минимум одно создание
  • Процедуры создания должны оставлять вновь инициализированный объект в состоянии, удовлетворяющем инварианту класса.

Хотя создание объекта связано с некоторыми тонкостями, создание атрибута с типичным объявлением x: T, выраженный в инструкции создания create x.make, состоит из следующей последовательности шагов:

  • Создание нового прямого экземпляра типа T.
  • Выполнение процедуры создания makeк вновь созданному экземпляру.
  • Присоедините вновь инициализированный объект к ent ity x.

В первом фрагменте ниже определен класс POINT. Процедура makeкодируется после ключевого слова feature.

Ключевое слово createвводит список процедур, которые могут использоваться для инициализации экземпляров. В этом случае список включает default_create, процедуру с пустой реализацией, унаследованной от класса ANY, и процедуру make, закодированную внутри класса.

class POINT create default_create, make feature make (a_x_value: REAL; a_y_value: REAL) do x: = a_x_value y: = a_y_value end x: REAL - Координата X y: REAL - Координата Y...

Во втором фрагменте класс, который является клиентом для POINT, имеет объявления my_point_1и my_point_2типа POINT.

В процедурном коде, my_point_1создается как исходная точка (0,0, 0,0). Поскольку процедура создания не указана, используется процедура default_create, унаследованная от класса ANY. Эта строка могла быть закодирована create my_point_1.default_create. В инструкции с ключевым словом createможно использовать только процедуры, названные процедурами создания. Далее следует инструкция создания для my_point_2, предоставляющая начальные значения для координат my_point_2. Третья инструкция выполняет обычный вызов экземпляра процедуры makeдля повторной инициализации экземпляра, присоединенного к my_point_2, с другими значениями.

my_point_1: POINT my_point_2: POINT... create my_point_1 create my_point_2.make (3.0, 4.0) my_point_2.make (5.0, 8.0)...

CFML

CFML использует метод с именем ' init'как метод конструктора.

Cheese.cfc

component {// свойства property name = "cheeseName"; // функция конструктора Cheese init (обязательная строка cheeseName) {variables.cheeseName = arguments.cheeseName; вернуть это; }}

Создать экземпляр сыра.

myCheese = новый сыр («Чеддер»);

Начиная с ColdFusion 10, CFML также поддерживает указание имени метода конструктора:

component initmethod = "Cheese" {// properties property name = "cheeseName"; // функция-конструктор Cheese Cheese (обязательная строка cheeseName) {variables.cheeseName = arguments.cheeseName; вернуть это; }}

Object Pascal

В Object Pascal конструктор аналогичен фабричному методу. Единственное синтаксическое отличие от обычных методов - это ключевое слово constructorперед именем (вместо procedureили function). Он может иметь любое имя, хотя по соглашению в качестве префикса используется Create, например, в CreateWithFormatting. Создание экземпляра класса похоже на вызов статического метода класса: TPerson.Create ('Peter').

program OopProgram; тип TPerson = class private FName: string; публичное свойство Name: чтение строки FName; конструктор Create (AName: string); конец; конструктор TPerson.Create (AName: string); begin FName: = AName; конец; var Person: TPerson; begin Person: = TPerson.Create ('Питер'); // выделяет экземпляр TPerson, а затем вызывает TPerson.Create с параметром AName = 'Peter' end.

Perl 5

В языке программирования Perl версии 5 по умолчанию конструкторами являются фабричные методы, то есть методы, которые создают и возвращают объект, конкретно то есть создать и вернуть благословенную ссылку. Типичный объект - это ссылка на хэш, хотя ссылки на другие типы также используются редко. По соглашению единственный конструктор называется новым, хотя ему разрешено называть его иначе или иметь несколько конструкторов. Например, класс Person может иметь конструктор с именем new, а также конструктор new_from_file, который считывает файл для атрибутов Person, и new_from_person, который использует другой объект Person в качестве шаблона.

пакет Person; # В Perl конструкторы условно называются "новыми". sub new {# Имя класса неявно передается как 0-й аргумент. мой $ class = shift; # Значения атрибутов по умолчанию, если они есть. мои% defaults = (foo =>"bar"); # Инициализировать атрибуты как комбинацию значений по умолчанию и переданных аргументов. мой $ self = {% defaults, @_}; # Проверить наличие обязательных аргументов, инварианта класса и т. Д. If (не определено $ self ->{first_name}) {die "Обязательный атрибут отсутствует в Person->new (): first_name"; } if (не определено $ self ->{last_name}) {die "Обязательный атрибут отсутствует в Person->new (): last_name"; } if (определены $ self ->{age} и $ self ->{age} < 18) { die "Invalid attribute value in Person->new (): age < 18"; } # Perl makes an object belong to a class by 'bless'. bless $self, $class; return $self; } 1;

Perl 5 с Moose

С объектной системой Moose для Perl большая часть этого шаблона может быть опущена, создается новый по умолчанию, можно указать атрибуты, а также указать, можно ли их устанавливать, сбрасывать или требовать. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD, который сгенерированный конструктор Moose вызовет после проверки аргументов. Можно указать метод BUILDARGS для обработки аргументов конструктора не в форме hashref / key =>value.

package Person; # включить объект в стиле Moose конструкция use Moose; # имя (строка) может быть установлено только во время построения ('ro') имеет first_name =>(is =>'ro', isa =>'Str', required =>1); # last name (строка) может быть установлена ​​только во время построения ('ro') has last_name =>(is =>'ro', isa =>'Str', required =>1); # age (Integer) можно изменить после построения ('rw'), и # не требуется передавать в конструктор. Также создает метод has_age, который возвращает # true, если установлен age has age =>(is =>'rw', isa =>'Int', predicate =>'has_age'); # Проверить пользовательские требования sub BUILD {my $ self = shift; if ($ self->has_age $ self->age < 18) { # no under 18s die "No under-18 Persons"; } } 1;

В обоих случаях класс Person создается следующим образом:

use Person; my $ p = Person->new (first_name =>'Sam', last_name =>'Ashe', age =>42);

Raku

С Raku можно исключить еще больше шаблонов, учитывая, что новый метод по умолчанию наследуется, атрибуты могут могут быть указаны, а также могут ли они быть установлены, сброшены или являются обязательными. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD, который будет вызываться, чтобы разрешить настраиваемую инициализацию. Метод TWEAK может быть указан для публикации -обработать любые атрибуты, уже (неявно) инициализированные.

class Person {has Str $.first-name is required; # Имя (строка) может быть установлено только # во время построения (. означает "общедоступный"). has Str $.last-name требуется; # Фамилия (строка) может быть установлена ​​только # во время построения (! означает "частный"). has Int $.age is rw; # Возраст (целое число) может быть измененным после # конструкции ('rw') и не требуется # во время создания объекта. # Создайте метод 'full-name', который возвращает полное имя человека. # К этому методу можно получить доступ вне класса. method full-name {$! first-name.tc ~ "" ~ $! last-name.tc} # Создайте метод has-age, который возвращает true, если age был установлен. # Этот метод используется только внутри класса, поэтому он объявлен как "частный" # путем добавления перед его именем символа! method! has-age {self.age.defined} # Проверка метода пользовательских требований TWEAK {if self! has-age $! age < 18 { # No under 18 die "No person under 18"; } } }

Экземпляр класса Person создается следующим образом:

my $ p0 = Person.new (first-name =>'Sam', last-name =>'Ashe', age =>42); мой $ p1 = Person.new (first-name =>'grace', last-name =>'hopper'); скажите $ p1.full-name (); # OUTPUT: «Grace Hopper␤»

В качестве альтернативы, именованные параметры можно указать с помощью синтаксиса пары двоеточий в Perl 6:

my $ p0 = Person.new (: first-name ,: last -имя ,: возраст (42)); мой $ p1 = Person.new (: имя ,: фамилия );

И если вы установили переменные с именами, идентичными именованным параметрам, вы можете использовать ярлык, который будет использовать name переменной для именованного параметра:

my $ first-name = "Сэм"; мой $ last-name = "Эш"; мой $ age = 42; мой $ p0 = Person.new (: $ first-name,: $ last-name,: $ age);

PHP

В PHP версии 5 и выше конструктором является метод с именем __construct ()(обратите внимание, что это двойное подчеркивание), ключевое слово newавтоматически вызывается после создания объекта. Обычно он используется для автоматического выполнения инициализации, например инициализации свойств. Конструкторы также могут принимать аргументы, и в этом случае, когда записывается оператор new, вам также необходимо отправить аргументы конструктора для параметров.

class Person {private string $ name; публичная функция __construct (строка $ name): void {$ this->name = $ name; } публичная функция getName (): строка {return $ this->name; }}

Python

В Python конструкторы определяются одним или обоими методами __new__и __init__. Новый экземпляр создается путем вызова класса, как если бы это была функция, которая вызывает методы __new__и __init__. Если метод конструктора не определен в классе, будет вызван следующий метод, найденный в классе Порядок разрешения методов.

В типичном случае только __init __Метод нужно определить. (Наиболее частое исключение - для неизменяемых объектов.)

>>>class ExampleClass (object):... def __new __ (cls, value):... print ("Создание нового экземпляра...")... # Вызвать конструктор суперкласса для создания экземпляра.... instance = super (ExampleClass, cls).__ new __ (cls)... return instance... def __init __ (self, value):... print ("Инициализация экземпляра...")... self. payload = value>>>exampleInstance = ExampleClass (42) Создание нового экземпляра... Инициализация экземпляра...>>>print (exampleInstance.payload) 42

Классы обычно действуют как фабрики для новых экземпляров сами по себе, то есть класс является вызываемым объектом (например, функцией), причем вызов является конструктором, а вызов класса возвращает экземпляр этого класса. Однако методу __new__разрешено возвращать что-то, кроме экземпляра класса для специализированных целей. В этом случае __init__не вызывается.

Ruby

В Ruby конструкторы создаются путем определения метода с именем initialize. Этот метод выполняется для инициализации каждого нового экземпляра.

irb (main): 001: 0>class ExampleClass irb (main): 002: 1>def initialize irb (main): 003: 2>помещает "Hello there" irb (main): 004: 2>end irb (main): 005: 1>end =>nil irb (main): 006: 0>ExampleClass.new Здравствуйте =># 

OCaml

В OCaml есть один конструктор. Параметры определяются сразу после имени класса. Они могут использоваться для инициализации переменных экземпляра и доступны во всем классе. Анонимный скрытый метод, называемый инициализатором, позволяет оценивать выражение сразу после того, как объект был построен.

class person first_name last_name = object val full_name = first_name ^ "" ^ last_name инициализатор print_endline ("Здравствуйте, я" ^ full_name ^ ".") Method get_last_name = last_name end ;; let alonzo = новый человек "Алонсо" "Церковь" в (* Здравствуйте, я Алонзо Черч. *) print_endline alonzo # get_last_name (* Церковь *)

См. также

Примечания

Ссылки

Последняя правка сделана 2021-05-15 10:41:00
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте