- •Создание простого конструктора
- •Представление о деструкторе
- •Что вам необходимо знать
- •Конструктор (программирование)
- •[Править]Назначение конструктора
- •[Править]Виды конструкторов
- •[Править]Конструктор по умолчанию
- •[Править]Конструктор копирования
- •[Править]Виртуальный конструктор
- •[Править]Синтаксис
- •[Править]Конструктор преобразования
- •[Править]Пример
- •[Править]ColdFusion [править]Пример
- •[Править]php [править]Пример
- •[Править]Упрощенные конструкторы (с псевдокодом)
[Править]Конструктор преобразования
Конструктор, принимающий один аргумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.
[Править]Виртуальный конструктор
Конструктор не бывает виртуальным в смысле виртуального метода — для того, чтобы механизм виртуальных методов работал, нужно запустить конструктор, который автоматически настроит таблицу виртуальных методов данного объекта.
«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в Delphi, но нет в C++ и Java. Этот механизм позволяет создать объект любого заранее неизвестного класса при двух условиях:
-
этот класс является потомком некоего наперёд заданного класса (в данном примере это класс TVehicle);
-
на всём пути наследования от базового класса к создаваемому цепочка переопределения не обрывалась. При переопределении виртуального метода синтаксис Delphi требует ключевое слово overload, чтобы старая и новая функции с разными сигнатурами могли сосуществовать, override для переопределения функции либо reintroduce для задания новой функции с тем же именем — последнее недопустимо.
type
TVehicle = class
constructor Create; virtual;
end;
TAutomobile = class (TVehicle)
constructor Create; override;
end;
TMotorcycle = class (TVehicle)
constructor Create; override;
end;
TMoped = class (TMotorcycle) // обрываем цепочку переопределения - заводим новый Create
constructor Create(x : integer); reintroduce;
end;
В языке вводится так называемый классовый тип. Этот тип в качестве значения может принимать название любого класса, производного от TVehicle.
type
CVehicle = class of TVehicle;
Такой механизм позволяет создавать объекты любого заранее неизвестного класса, производного от TVehicle.
var
cv : CVehicle;
v : TVehicle;
cv := TAutomobile;
v := cv.Create;
Заметьте, что код
cv := TMoped;
v := cv.Create;
является некорректным — директива reintroduce разорвала цепочку переопределения виртуального метода, и в действительности будет вызван конструктор TMotorcycle.Create (а значит, будет создан мотоцикл, а не мопед!)
См. также Фабрика (шаблон проектирования)
[Править]Синтаксис
[править]С++
Имя конструктора должно совпадать с именем класса. Допускается использовать несколько конструкторов с одинаковым именем, но различными параметрами.
class ClassWithConstructor {
public:
/* Инициализация внутреннего объекта с помощью конструктора */
ClassWithConstructor(float parameter): object(parameter) {}/* вызов конструктора AnotherClass(float); */
private:
AnotherClass object;
};
[править]Python
В языке Python конструктором является метод класса с именем __init__ . Кроме того не следует забывать, что первым аргументом любого метода должен быть указатель на контекст класса self.
[править]Пример
class ClassWithConstructor:
def __init__(self):
"""This method is constructor."""
pass
[править]Delphi
В Delphi, в отличие от C++, для объявления конструктора служит ключевое слово constructor. Имя конструктора может быть любым, но рекомендуется называть конструктор Create.
[править]Пример
TClassWithConstructor = class
public
constructor Create;
end;
[править]Java
Некоторые отличия между конструкторами и другими методами Java:
-
конструкторы не имеют чётко определённого типа возвращаемых данных;
-
конструкторы не могут напрямую вызываться (необходимо использовать ключевое слово new);
-
конструкторы не могут быть synchronized, final, abstract, native и static типов;
-
конструкторы всегда выполняются в том же потоке.
[править]Пример
public class Example
{
// Конструктор по умолчанию
public Example()
{
this(1);
}
// Перегрузка конструктора
public Example(int input)
{
data = input;
}
private int data;
}
// код, иллюстрирующий создание объекта описанным выше конструктором
Example e = new Example(42);
[править]JavaScript
В JavaScript в качестве конструктора выступает обычная функция, используемая в качестве операнда оператора new. Для обращения к созданному объекту используется ключевое словоthis.
[править]Пример
function Example(initValue) {
this.myValue = initValue;
}
Example.prototype.getMyValue = function() {
return this.myValue;
}
// код, иллюстрирующий создание объекта описанным выше конструктором
var exampleObject = new Example(120);
[править]Visual Basic .NET
Конструкторы в Visual Basic .NET используют обычный метод объявления с именем New.
[править]Пример
Class Foobar
Private strData As String
' Constructor
Public Sub New(ByVal someParam As String)
strData = someParam
End Sub
End Class
' некий код
' иллюстрирующий создание объекта описанным выше конструктором
Dim foo As New Foobar(".NET")
[править]C#
[править]Пример
class myClass
{
private int mA;
private string mB;
public myClass(int a, string b)
{
mA = a;
mB = b;
}
}
// код, иллюстрирующий создание объекта описанным выше конструктором
myClass c = new myClass(42, "string");
[править]Эйфель
В Эйфеле подпрограммы, которые инициализируют объекты, называются процедурами создания. Процедуры создания в чём-то подобны конструкторам и в чём-то отличаются. Они имеют следующие характеристики:
-
Процедуры создания не имеют никакого явного типа результата возврата (по определению процедуры[Примечание 1]).
-
процедуры создания поименованы (имена ограничены допустимыми идентификаторами);
-
процедуры создания задаются по именам в тексте класса;
-
процедуры создания могут быть вызваны напрямую (как обычные процедуры) для повторной инициализации объектов;
-
каждый эффективный (то есть конкретный, не абстрактный) класс должен (явно или неявно) указать по крайней мере одну процедуру создания;
-
процедуры создания отвечают за приведение только что проинициализированного объекта в состояние, которое удовлетворяет инварианту класса[Примечание 2].
Хотя создание объекта является предметом некоторых тонкостей [Примечание 3], создание атрибута с типовым объявлением x: T, выраженном в виде инструкции создания create x.makeсостоит из следующей последовательности шагов:
-
создать новый непосредственный экземпляр типа T[Примечание 4];
-
выполнить процедуру создания make для вновь созданного экземпляра;
-
прикрепить вновь созданный объект к сущности x.
