Конструктор (объектно-ориентированное программирование) - Constructor (object-oriented programming)
В основанный на классе объектно-ориентированного программирования, а конструктор (сокращение: ctor) - особый тип подпрограмма призвал создать объект. Он подготавливает новый объект к использованию, часто принимая аргументы что конструктор использует для установки требуемых переменные-члены.
Конструктор похож на метод экземпляра, но он отличается от метода тем, что не имеет явного тип возврата, это не подразумевается унаследованный и обычно у него разные правила для модификаторов области видимости. Конструкторы часто имеют то же имя, что и объявляющие учебный класс. У них есть задача инициализация объект члены данных и создания инвариант класса, не выполняется, если инвариант недействителен. Правильно написанный конструктор оставляет получившийся объект в действительный государственный. Неизменяемые объекты должен быть инициализирован в конструкторе.
Большинство языков позволяют перегрузка конструктор в том смысле, что для класса может быть более одного конструктора с разными параметрами. Некоторые языки учитывают некоторые особые типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возврата нового экземпляра класса, абстрагируются с помощью фабрики, которые также создают объекты, но могут делать это различными способами, используя несколько классов или разные схемы распределения, такие как пул объектов.
Типы
Параметризованные конструкторы
Конструкторы, которые могут принимать хотя бы один аргумент, называются параметризованными конструкторами. Когда объект объявляется в параметризованном конструкторе, начальные значения должны быть переданы в качестве аргументов функции конструктора. Обычный способ объявления объекта может не работать. Конструкторы могут вызываться явно или неявно. Метод неявного вызова конструктора также называется сокращенным методом. Если мы хотим инициализировать поля класса вашими собственными значениями, используйте параметризованный конструктор.
учебный класс Пример { общественный: Пример(); Пример(int а, int б); // Параметризованный конструктор. частный: int Икс_; int y_;};Пример::Пример() = дефолт;Пример::Пример(int Икс, int у) : Икс_(Икс), y_(
Пример е = Пример(0, 50); // Явный вызов.Пример e2(0, 50); // Неявный вызов.
Конструкторы по умолчанию
Если программист не предоставляет конструктор для экземпляра класса, компилятор Java вставляет конструктор по умолчанию в ваш код от вашего имени. Этот конструктор известен как конструктор по умолчанию. Вы не найдете его в исходном коде (файле java), поскольку он будет вставлен в код во время компиляции и существует в файле .class. Поведение конструктора по умолчанию зависит от языка. Он может инициализировать элементы данных нулевыми или другими одинаковыми значениями или вообще ничего не делать. В Java «конструктор по умолчанию» относится к конструктору с нулевым значением, который автоматически генерируется компилятором, если для класса не определены конструкторы или в отсутствие каких-либо конструкторов, определенных программистом (например, в Java конструктор по умолчанию неявно вызывает нулевого конструктора суперкласса, затем выполняет пустое тело). Для всех полей остается исходное значение 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false (логический тип) или null (ссылочные типы).
#включают <iostream>учебный класс Ученик { общественный: Ученик(int а = 0, int б = 0); // Конструктор по умолчанию. int а; int б;};
Копировать конструкторы
Как и C ++, Java также поддерживает «Конструктор копирования». Но, в отличие от C ++, Java не создает конструктор копирования по умолчанию, если вы не пишете свой собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. У конструктора Copy есть один формальный параметр, который является типом класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Несмотря на то, что оба класса одинаковы, он считается конструктором преобразования. Хотя конструкторы копирования обычно сокращенно называются ctor или cctor, они не имеют ничего общего с конструкторами классов, используемыми в .NET с использованием того же сокращения.
Конструкторы преобразования
Конструкторы преобразования предоставляют компилятору средство неявно создавать объект, принадлежащий одному классу, на основе объекта другого типа. Эти конструкторы обычно вызываются неявно для преобразования аргументов или операндов в соответствующий тип, но они также могут вызываться явно.
Конструкторы перемещения
В C ++ переместить конструкторы берут ссылку на значение объекта класса и используются для передачи владения ресурсами объекта параметра.
Синтаксис
- Ява, C ++, C #, ActionScript, PHP 4 и MATLAB имеют соглашение об именах, в котором конструкторы имеют то же имя, что и класс, с которым они связаны.
- В PHP 5 рекомендуемое имя конструктора
__construct
. Для обратной совместимости будет вызываться метод с тем же именем, что и у класса, если__construct
метод не может быть найден. Начиная с PHP 5.3.3, это работает только для классов без пространства имен.[1] - В PHP 7 вы всегда должны называть конструктор как
__construct
. Методы с тем же именем, что и класс, вызовут ошибку уровня E_DEPRECATED.[1] - В Perl конструкторы, по соглашению, называются «новыми» и должны делать изрядное количество объектов.
- В Система объектов лося для Perl конструкторы (названные новый) создаются автоматически и расширяются путем указания СТРОИТЬ метод.
- В Visual Basic .NET, конструктор называется "
Новый
". - В Python, конструктор разделен на два метода, "
__новый__
" и "__в этом__
".__новый__
отвечает за выделение памяти для экземпляра и получает класс в качестве аргумента (обычно называется "cls
").__в этом__
метод (часто называемый "инициализатором") передается вновь созданному экземпляру в качестве аргумента (обычно называется "себя
").[2] - Object Pascal конструкторы обозначены ключевым словом "
конструктор
"и могут иметь определенные пользователем имена (но чаще всего называются"Создавать
"). - В Цель-C, метод конструктора разделен на два метода, "
выделить
" и "в этом
"свыделить
метод, выделяющий (выделяя) память для экземпляра класса, ав этом
, обрабатывающий основную часть инициализации экземпляра. Вызов метода "новый
"вызывает каквыделить
ив этом
методы для экземпляра класса.
Организация памяти
В Java, C # и VB .NET конструктор создает объекты ссылочного типа в специальной структуре памяти, называемой "куча ". Типы значений (например, int, double и т. Д.) Создаются в последовательной структуре, называемой"куча ".VB .NET и C # также позволяют использовать новый для создания объектов типа значения, но эти объекты типа значения создаются в стеке независимо от того, используется оператор или нет.
В C ++ объекты создаются в стеке, когда конструктор вызывается без оператора new, и создаются в куче, когда конструктор вызывается с оператором new. Объекты стека удаляются неявно, когда они выходят за пределы области видимости, в то время как объекты кучи должны быть удалены неявно деструктором или явно с помощью Удалить оператор.
Сведения о языке
Было предложено, чтобы эта статья была расколоть в новую статью под названием Сравнение языков программирования (ООП, конструкторы). (Обсуждать) (Май 2016) |
Ява
В Ява, конструкторы отличаются от других методов тем, что:
- Конструкторы никогда не имеют явного возвращаемого типа.
- Конструкторы нельзя вызывать напрямую (ключевое слово «
новый
Вызывает их). - Конструкторы не могут быть синхронизированный, окончательный, Абстрактные, родные, или же статический.
- Не должно содержать модификаторов
Конструкторы Java выполняют следующие задачи в следующем порядке:
- Вызовите конструктор суперкласса по умолчанию, если конструктор не определен.
- Инициализируйте переменные-члены указанными значениями.
- Выполняет тело конструктора.
Java разрешает пользователям вызывать один конструктор в другом конструкторе, используя это()
ключевое слово. Но это()
должно быть первое заявление. [3]
учебный класс Пример{ Пример() // Непараметрический конструктор { это(1); // Вызов конструктора Система.из.println("0-аргументы-минусы"); } Пример(int а) // Параметризованный конструктор { Система.из.println("1-аргумент-минус"); }}общественный статический пустота главный(Нить[] аргументы){ Пример е = новый Пример();}
Java предоставляет доступ к суперкласс конструктор через супер
ключевое слово.
общественный учебный класс Пример{ // Определение конструктора. общественный Пример() { это(1); } // Перегрузка конструктора общественный Пример(int Вход) { данные = Вход; // Это присвоение } // Объявление переменных экземпляра. частный int данные;}
// Код в другом месте// Создание экземпляра объекта с помощью вышеуказанного конструктораПример е = новый Пример(42);
Конструктор, принимающий нулевое количество аргументов, называется конструктором без аргументов или без аргументов.[4]
JavaScript
Начиная с ES6, JavaScript имеет прямые конструкторы, как и многие другие языки программирования. Они написаны как таковые
учебный класс FooBar { конструктор(баз) { это.баз = баз }}
Это может быть создано как таковое
const фу = новый FooBar('7')
Эквивалентом этого до ES6 было создание функции, которая создает экземпляр объекта как такового.
функция FooBar (баз) { это.баз = баз;}
Это создается так же, как указано выше.
Visual Basic .NET
В Visual Basic .NET, конструкторы используют объявление метода с именем "Новый
".
Учебный класс Foobar Частный strData В качестве Нить 'Конструктор Общественные Sub Новый(ByVal someParam В качестве Нить) strData = someParam Конец SubКонец Учебный класс
код в другом месте'создание экземпляра объекта с помощью вышеуказанного конструктораТусклый фу В качестве Новый Foobar(".СЕТЬ")
C #
Пример C # конструктор:
общественный учебный класс Мой класс{ частный int а; частный нить б; // Конструктор общественный Мой класс() : это(42, "нить") { } // Перегрузка конструктора общественный Мой класс(int а, нить б) { это.а = а; это.б = б; }}
// Код где-нибудь// Создание объекта с помощью конструктора вышеМой класс c = новый Мой класс(42, "нить");
Статический конструктор C #
В C #, а статический конструктор статический инициализатор данных. Статические конструкторы также называются конструкторы классов. Поскольку фактически созданный метод имеет имя .cctor их часто также называют «cctors».[5][6]
Статические конструкторы позволяют инициализировать сложную статическую переменную.[7]Статические конструкторы вызываются неявно при первом обращении к классу. Любой вызов класса (статический вызов или вызов конструктора) запускает выполнение статического конструктора. потокобезопасный и реализовать одноэлементный образец. При использовании в общее программирование класса, статические конструкторы вызываются при каждом новом создании универсального экземпляра, по одному для каждого типа. Также создаются статические переменные.
общественный учебный класс Мой класс{ частный статический int _A; // Обычный конструктор статический Мой класс() { _A = 32; } // Стандартный конструктор по умолчанию общественный Мой класс() { }}
// Код где-нибудь// Создание объекта с помощью конструктора выше// прямо перед созданием экземпляра// Выполняется статический конструктор переменной и _A равно 32Мой класс c = новый Мой класс();
C ++
В C ++, имя конструктора - это имя класса. Он ничего не возвращает. Может иметь параметры как любые функция-член. Функции конструктора обычно объявляются в общедоступном разделе, но также могут быть объявлены в защищенном и закрытом разделах, если пользователь хочет ограничить доступ к ним.
Конструктор состоит из двух частей. Во-первых, это список инициализаторов который следует за список параметров и перед телом метода. Он начинается с двоеточия, а записи разделяются запятыми. Список инициализаторов не требуется, но дает возможность предоставлять значения для элементов данных и избегать отдельных операторов присваивания. Список инициализаторов требуется, если у вас есть const элементы данных ссылочного типа или члены, не имеющие логики конструктора без параметров. Присваивания выполняются в соответствии с порядком, в котором объявлены элементы данных (даже если порядок в списке инициализаторов отличается).[8] Вторая часть - это тело, которое представляет собой обычное тело метода, заключенное в фигурные скобки.
C ++ позволяет использовать более одного конструктора. Остальные конструкторы должны иметь другие параметры. Кроме того, конструкторы, которые содержат параметры, которым заданы значения по умолчанию, должны придерживаться ограничения, согласно которому не всем параметрам присваиваются значения по умолчанию. Это ситуация, которая имеет значение только при наличии конструктора по умолчанию. Конструктор базовый класс (или базовые классы) также могут вызываться производным классом. Функции-конструкторы не наследуются, и на их адреса нельзя ссылаться. Когда требуется выделение памяти, новый и Удалить операторы вызываются неявно.
Конструктор копирования имеет параметр того же типа, который передается как const ссылка, например Вектор (const Vector & rhs). Если он не указан явно, компилятор использует конструктор копирования для каждой переменной-члена или просто копирует значения в случае примитивных типов. Реализация по умолчанию неэффективна, если класс имеет динамически выделяемые члены (или дескрипторы для других ресурсов), потому что это может привести к двойным вызовам Удалить (или двойное высвобождение ресурсов) при уничтожении.
учебный класс Foobar { общественный: Foobar(двойной р = 1.0, двойной альфа = 0.0) // Конструктор, параметры со значениями по умолчанию. : Икс_(р * потому что(альфа)) // <- Список инициализаторов { y_ = р * грех(альфа); // <- Нормальное присвоение } частный: двойной Икс_; двойной y_;};
Примеры вызовов:
Foobar а, б(3), c(5, M_PI/4);
При возврате объектов из функций или передаче объектов по значению конструктор копирования объектов будет вызываться неявно, если только оптимизация возвращаемого значения применяется.
C ++ неявно генерирует конструктор копирования по умолчанию, который будет вызывать конструкторы копирования для всех базовых классов и всех переменных-членов, если программист не предоставит один, явно удаляет конструктор копирования (для предотвращения клонирования) или один из базовых классов или конструктор копирования переменных-членов удаляется или недоступен (частный). В большинстве случаев требуется индивидуальный конструктор копирования (например. подсчет ссылок, глубокая копия указателей) также требуют настройки деструктор и оператор присваивания копий. Это обычно называют Правило трех.
F #
В F #, конструктор может включать любые позволять
или же делать
операторы, определенные в классе. позволять
операторы определяют частные поля и делать
операторы выполняют код. Дополнительные конструкторы можно определить с помощью новый
ключевое слово.
тип Мой класс(_а : int, _б : нить) = учебный класс // Первичный конструктор позволять а = _а позволять б = _б делать printfn "a =% i, b =% s" а б // Дополнительные конструкторы новый(_а : int) = Мой класс(_а, "") тогда printfn «Задан целочисленный параметр» новый(_б : нить) = Мой класс(0, _б) тогда printfn "Указан строковый параметр" новый() = Мой класс(0, "") тогда printfn «Параметр не указан»конец
// Код где-нибудь// создание экземпляра объекта с помощью основного конструкторапозволять c1 = новый Мой класс(42, "нить")// создание объекта с дополнительными конструкторамипозволять c2 = новый Мой класс(42)позволять c3 = новый Мой класс("нить")позволять c4 = Мой класс() // ключевое слово "новое" необязательно
Эйфель
В Эйфель, процедуры инициализации новых объектов называются процедуры создания. Процедуры создания имеют следующие особенности:
- Процедуры создания не имеют явного возвращаемого типа (по определению процедура).[а]
- Названы процедуры создания.
- Процедуры создания обозначаются по имени как процедуры создания в тексте класса.
- Процедуры создания могут быть явно вызваны для повторной инициализации существующих объектов.
- Каждый эффективный (т.е. конкретный или не абстрактный) класс должен обозначать хотя бы одну процедуру создания.
- Процедуры создания должны оставлять вновь инициализированный объект в состоянии, удовлетворяющем инварианту класса.[b]
Хотя создание объекта связано с некоторыми тонкостями,[9] создание атрибута с типовым объявлением х: Т
как указано в инструкции по созданию создать x.make
состоит из следующей последовательности шагов:
- Создать новый прямой экземпляр типа
Т
.[c] - Выполните процедуру создания
делать
к вновь созданному экземпляру. - Присоедините вновь инициализированный объект к сущности
Икс
.
В первом фрагменте ниже класс ТОЧКА
определено. Процедура делать
кодируется после ключевого слова особенность
.
Ключевое слово Создайте
вводит список процедур, которые можно использовать для инициализации экземпляров. В этом случае список включает default_create
, процедура с пустой реализацией, унаследованной от класса ЛЮБОЙ
, а делать
процедура закодирована внутри класса.
учебный класс ТОЧКАСоздайте default_create, делатьособенность делать (a_x_value: НАСТОЯЩИЙ; a_y_value: НАСТОЯЩИЙ) делать Икс := a_x_value у := a_y_value конец Икс: НАСТОЯЩИЙ - Координата X у: НАСТОЯЩИЙ - координата Y ...
Во втором фрагменте класс, который является клиентом для ТОЧКА
есть декларации my_point_1
и my_point_2
типа ТОЧКА
.
В процедурном коде my_point_1
создается как начало координат (0,0, 0,0). Поскольку процедура создания не указана, процедура default_create
унаследованный от класса ЛЮБОЙ
используется. Эта строка могла быть закодирована создать my_point_1.default_create
.Только процедуры, названные процедурами создания, могут использоваться в инструкции с Создайте
ключевое слово.Далее - инструкция по созданию my_point_2
, предоставляя начальные значения для my_point_2
координаты. Третья инструкция выполняет обычный вызов экземпляра делать
процедура для повторной инициализации экземпляра, прикрепленного к my_point_2
с разными значениями.
my_point_1: ТОЧКА моя_точка_2: ТОЧКА ... Создайте my_point_1 Создайте my_point_2.делать (3.0, 4.0) my_point_2.делать (5.0, 8.0) ...
CFML
CFML использует метод с именем 'в этом
'как метод конструктора.
Cheese.cfc
компонент { // характеристики свойство имя="cheeseName"; // конструктор функция Сыр в этом( требуется нить cheeseName ) { переменные.cheeseName = аргументы.cheeseName; возвращаться это; }}
Создайте экземпляр сыра.
myCheese = новый Сыр( 'Чеддер' );
Начиная с ColdFusion 10,[10] CFML также поддерживает указание имени метода конструктора:
компонент initmethod="Сыр" { // характеристики свойство имя="cheeseName"; // конструктор функция Сыр Сыр( требуется нить cheeseName ) { переменные.cheeseName = аргументы.cheeseName; возвращаться это; }}
Object Pascal
В Object Pascal, конструктор похож на заводской метод. Единственное синтаксическое отличие от обычных методов - ключевое слово конструктор
перед именем (вместо процедура
или же функция
). Он может иметь любое имя, хотя по соглашению Создавать
как префикс, например, в CreateWithFormatting
. Создание экземпляра класса похоже на вызов статического метода класса: TPerson.Create ('Питер')
.
программа OopProgram;тип TPerson = учебный класс частный FName: нить; общественный свойство Имя: нить читать FName; конструктор Создавать(Имя: нить); конец;конструктор TPerson.Создавать(Имя: нить);начинать FName := Имя;конец;вар Человек: TPerson;начинать Человек := TPerson.Создавать('Питер'); // выделяет экземпляр TPerson, а затем вызывает TPerson.Create с параметром AName = 'Peter'конец.
Perl 5
В Язык программирования Perl версия 5, по умолчанию конструкторы фабричные методы, то есть методы, которые создают и возвращают объект, что конкретно означает создание и возврат благословенной ссылки. Типичный объект - это ссылка на хэш, хотя ссылки на другие типы также используются редко. По соглашению единственный конструктор называется новый, хотя разрешено называть его иначе или иметь несколько конструкторов. Например, у класса Person может быть конструктор с именем новый а также конструктор new_from_file который читает файл для атрибутов Person, и new_from_person который использует другой объект Person в качестве шаблона.
упаковка Человек;# В Perl конструкторы условно называются "новыми".суб новый { # Имя класса неявно передается как 0-й аргумент. мой $ класс = сдвиг; # Значения атрибутов по умолчанию, если они есть. мой % по умолчанию = ( фу => "бар" ); # Инициализировать атрибуты как комбинацию значений по умолчанию и переданных аргументов. мой $ self = { % по умолчанию, @_ }; # Проверить необходимые аргументы, инвариант класса и т. Д. если ( нет определенный $ self->{имя} ) { умереть «Обязательный атрибут отсутствует в Person-> new (): first_name»; } если ( нет определенный $ self->{фамилия} ) { умереть "Обязательный атрибут отсутствует в Person-> new (): last_name"; } если ( определенный $ self->{возраст} и $ self->{возраст} < 18 ) { умереть "Недопустимое значение атрибута в Person-> new (): age <18"; } # Perl делает объект принадлежащим классу с помощью 'bless'. благословить $ self, $ класс; возвращаться $ self;}1;
Perl 5 с Moose
С Система объектов лося для Perl большую часть этого шаблона можно опустить, по умолчанию новый создается, можно указать атрибуты, а также указать, могут ли они быть установлены, сброшены или являются обязательными. Кроме того, любые дополнительные функции конструктора могут быть включены в СТРОИТЬ метод, который сгенерированный конструктором Moose вызовет после проверки аргументов. А СТРОИТЕЛЬСТВО может быть указан метод для обработки аргументов конструктора не в форме hashref / key => value.
упаковка Человек;# включить создание объектов в стиле лосяиспользовать лось;# имя (строка) может быть установлено только во время построения ('ro')имеет имя => (является => 'ро', это => 'Str', требуется => 1);# фамилия (строка) может быть установлена только во время строительства ('ro')имеет фамилия => (является => 'ро', это => 'Str', требуется => 1);# age (Integer) может быть изменен после построения ('rw') и не требуется# передается в конструктор. Также создает метод has_age, который возвращает# истина, если установлен возрастимеет возраст => (является => 'rw', это => 'Int', предикат => 'has_age');# Проверить индивидуальные требованиясуб СТРОИТЬ { мой $ self = сдвиг; если ($ self->has_age && $ self->возраст < 18) { # нет до 18 лет умереть «Запрещено лицам младше 18 лет»; }}1;
В обоих случаях класс Person создается следующим образом:
использовать Человек;мой $ p = Человек->новый( имя => 'Сэм', фамилия => 'Эш', возраст => 42 );
Раку
С Раку, можно исключить еще больше шаблонов, поскольку по умолчанию новый метод наследуется, атрибуты могут быть указаны, а также могут ли они быть установлены, сброшены или являются обязательными. Кроме того, любые дополнительные функции конструктора могут быть включены в СТРОИТЬ метод, который будет вызван для возможности индивидуальной инициализации. А TWEAK может быть указан для последующей обработки любых уже (неявно) инициализированных атрибутов.
учебный класс Человек { имеет Ул. $ .first-name является требуется; # Имя (строку) можно указать только в # время строительства (. означает «общедоступный»). имеет Ул. $ .last-name является требуется; # Фамилия (строка) может быть установлена только в # время строительства (символ! означает "частный"). имеет Int $ .age является rw; # Возраст (целое число) можно изменить после # конструкция ('rw'), и не требуется # во время создания объекта. # Создайте метод 'full-name', который возвращает полное имя человека. # К этому методу можно получить доступ вне класса. метод полное имя { $! имя.tc ~ " " ~ $! фамилия.tc } # Создайте метод has-age, который возвращает истину, если установлен возраст. # Этот метод используется только внутри класса, поэтому он объявлен как "частный" # добавив к имени перед именем! метод !возраст { себя.возраст.определенный } # Проверить индивидуальные требования метод TWEAK { если себя!возраст && $! возраст < 18 { # Нет до 18 лет умереть «Нет лиц младше 18 лет»; } }}
Класс Person создается следующим образом:
мой $ p0 = Человек.новый( имя => 'Сэм', фамилия => 'Эш', возраст => 42 );мой $ p1 = Человек.новый( имя => 'Грейс', фамилия => 'бункер' );сказать $ p1.полное имя(); # ВЫХОД: «Грейс Хоппер»
В качестве альтернативы именованные параметры могут быть указаны с использованием синтаксиса пары двоеточий в Perl 6:
мой $ p0 = Человек.новый( :имя<Sam>, :фамилия<Ashe>, :возраст(42) );мой $ p1 = Человек.новый( :имя<Grace>, :фамилия<Hopper> );
И если вы установили переменные с именами, идентичными именованным параметрам, вы можете использовать ярлык, который будет использовать имя переменной для указанного параметра:
мой $ first-name = "Сэм";мой $ фамилия = "Эш";мой $ возраст = 42;мой $ p0 = Человек.новый( :$ first-name, :$ фамилия, :$ возраст );
PHP
В PHP версии 5 и выше конструктором является метод с именем __construct ()
(обратите внимание, что это двойное подчеркивание), которое ключевое слово новый
автоматически вызывается после создания объекта. Обычно он используется для автоматического выполнения инициализации, например инициализации свойств. Конструкторы также могут принимать аргументы, и в этом случае, когда новый
Оператор написан, вам также необходимо отправить аргументы конструктора для параметров.[1]
учебный класс Человек{ частный нить $ name; общественный функция __construct(нить $ name): пустота { $ это->имя = $ name; } общественный функция getName(): нить { возвращаться $ это->имя; }}
Python
В Python, конструкторы определяются одним или обоими __новый__
и __в этом__
методы. Новый экземпляр создается путем вызова класса, как если бы это была функция, которая вызывает __новый__
и __в этом__
методы. Если метод конструктора не определен в классе, следующий найденный в классе Порядок разрешения метода будет называться.[11]
В типичном случае только __в этом__
метод должен быть определен. (Наиболее частое исключение - неизменяемые объекты.)
>>> учебный класс ExampleClass:... def __новый__(cls, ценить):... Распечатать("Создание нового экземпляра ...")... # Вызвать конструктор суперкласса для создания экземпляра.... пример = супер(ExampleClass, cls).__новый__(cls)... возвращаться пример... def __в этом__(себя, ценить):... Распечатать("Инициализация экземпляра ...")... себя.полезная нагрузка = ценить>>> exampleInstance = ExampleClass(42)Создание нового экземпляра ...Инициализация экземпляра ...>>> Распечатать(exampleInstance.полезная нагрузка)42
Классы обычно действуют как фабрики для новых экземпляров самих себя, то есть класс - это вызываемый объект (например, функция), при этом вызов является конструктором, а вызов класса возвращает экземпляр этого класса. Тем не менее __новый__
разрешено возвращать что-то иное, кроме экземпляра класса для специализированных целей. В этом случае __в этом__
не вызывается.[12]
Рубин
В Рубин, конструкторы создаются путем определения метода с именем инициализировать
. Этот метод выполняется для инициализации каждого нового экземпляра.
irb (основной): 001: 0>учебный класс ExampleClassirb (основной): 002: 1> def инициализироватьirb (основной): 003: 2> ставит "Привет"irb (основной): 004: 2> конецirb (основной): 005: 1>конец=> нольirb (основной): 006: 0>ExampleClass.новыйПривет=> #
OCaml
В OCaml, есть один конструктор. Параметры определяются сразу после имени класса. Они могут использоваться для инициализации переменных экземпляра и доступны во всем классе. Анонимный скрытый метод, называемый инициализатор
позволяет вычислить выражение сразу после того, как объект был построен.[13]
учебный класс человек имя фамилия = объект вал полное имя = имя ^ " " ^ фамилия инициализатор print_endline("Привет, я" ^ полное имя ^ ".") метод get_last_name = фамилия конец;;позволять Алонзо = новый человек "Алонзо" "Церковь" в (* Здравствуйте, я Алонзо Черч. *)print_endline Алонзо#get_last_name (*Церковь*)
Смотрите также
- Размещение сайта
- Созидательный образец
- Деструктор
- Глобальный конструктор в C ++ и его аналоге на C, ((конструктор)) атрибут функции
Примечания
- ^ Эйфель распорядки либо процедуры или же функции. У процедур никогда не бывает возвращаемого типа. Функции всегда имеют возвращаемый тип.
- ^ Поскольку должен быть удовлетворен инвариант унаследованного класса, обязательный вызов конструкторов родителей отсутствует.
- ^ Стандарт Eiffel требует инициализации полей при первом доступе, поэтому нет необходимости выполнять инициализацию полей по умолчанию во время создания объекта.
Рекомендации
- ^ а б c Конструкторы и деструкторы, из онлайн-документации PHP
- ^ Модель данных, из онлайн-документации Python
- ^ Подробности о конструкторе в java
- ^ «Предоставление конструкторов для ваших классов». Корпорация Oracle. 2013. Получено 2013-12-20.
- ^ «Сказочные приключения в кодировании». Эрик Липперт. 2013-02-06. Получено 2014-04-05.
- ^ Эксперт .NET 2.0 IL Assembler. АПресс. 2006-01-01. ISBN 9781430202233. Получено 2014-04-05.
- ^ Статический конструктор на C # в MSDN
- ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order Конструктор
- ^ Документ спецификации Eiffel ISO / ECMA
- ^ CFComponent
- ^ Модель данных
- ^ Модель данных
- ^ Руководство по OCaml