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

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

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

  • 1
  • 2
  • 345
  • 6
  • 7
  • 8
  • 9
  • Далее ⇒
  •