Экземплярный конструктор - это метод класса, который реализует действия необходимые для инициализации экземпляра класса.
constructor-declaration:
attributesopt constructor-modifiersopt constructor-declarator constructor-body
constructor-modifiers:
constructor-modifier
constructor-modifiers constructor-modifier
constructor-modifier:
Public
Protected
Friend
Private
constructor-declarator:
Constructor constructor-name ( formal-parameter-listopt ) constructor_initializeropt ;
constructor_initializeropt
: Inherited constructor-name ( argument-listopt )
: constructor-name ( argument-listopt )
constructor-body:
method-localsopt Begin method-body End Constructor constructor-nameopt ;
constructor-name:
identifier
Определение экземплярного конструктора может содержать список параметров, к которому применяются те же правила, что и к списку параметров метода. Список параметров экземплярного конструктора определяет его сигнатуру. Каждый из типов, используемых в списке параметров, должен иметь уровень доступа не ниже чем уровень доступа самого конструктора.
Экземплярные конструкторы не наследуются производными классами. Соответственно класс не имеет никаких других конструкторов кроме тех, что в нем описаны. Использование ключевого слова Inherited в заголовке конструктора приведет к вызову указанного конструктора базового класса при создании объекта производного класса. Если ключевое слово Inherited не указано, то можно указать один из конструкторов текущего класса.
Если класс не содержит ни одного определения экземплярного конструктора, то для него автоматически генерируется экземплярный конструктор по умолчанию.
Конструктор по умолчанию генерируется автоматически компилятором для класса, если его определение не содержит определений экземплярных конструкторов. Данный конструктор просто вызывает экземплярный конструктор без параметров родительского класса. Если родительский класс не имеет экземплярного конструктора без параметров, то возникает ошибка компиляции. Уровень доступа конструктора по умолчанию определен как родовой для абстрактных классов и как открытый для всех остальных.
Class A
//Конструктор по умолчанию
Public Constructor Create();
Begin
End Constructor;
//Конструктор с параметром
Public Constructor Create(i: integer);
Begin
End Constructor;
//Дополнительный конструктор с параметрами
//При инициализации будет вызван конструктор по умолчанию
Public Constructor CreateEx(i: integer; j: double): Create();
Begin
End Constructor;
End Class;
Class B: A
//Конструктор по умолчанию
//При инициализации будет вызван конструктор базового класса CreateEx
Public Constructor B(): Inherited CreateEx(-1, -1);
Begin
End Constructor;
End Class;
Sub Test();
Var
Obj: A;
Obj1: B;
Begin
Obj := New A(); //Вызов конструктора по умолчанию A.Create()
Obj := New A.Create(); //Явный вызов конструктора по умолчанию A.Create()
Obj := New A(1); //Вызов конструктора с параметром A.Create(i: Integer)
Obj1 := New B(); //Вызов конструктора по умолчанию B.Create()
End Sub;
См. также: