править]Виртуальный конструктор
Конструктор не бывает виртуальным в смысле виртуального метода — для того, чтобы механизм виртуальных методов работал, нужно запустить конструктор, который автоматически настроит таблицу виртуальных методов данного объекта.
«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в 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);Править]13-4456.php" class="back_link" > ⇐ Назад