Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УРОК 23 1б 2 п.docx
Скачиваний:
3
Добавлен:
26.10.2018
Размер:
53 Кб
Скачать
☆

[Править]Конструктор преобразования

Конструктор, принимающий один аргумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.

[Править]Виртуальный конструктор

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

«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в 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.