Конструктор (объектно-ориентированное программирование) - Constructor (object-oriented programming)

В классе на основе объектно-ориентированного программирования , конструктор (аббревиатура: т е р ) представляет собой особый тип подпрограммы призваны создать объект . Он подготавливает новый объект к использованию, часто принимая аргументы, которые конструктор использует для установки требуемых переменных-членов .

Конструктор похож на метод экземпляра , но отличается от метода тем, что у него нет явного типа возвращаемого значения , он не наследуется неявно и обычно имеет другие правила для модификаторов области видимости. Конструкторы часто имеют то же имя, что и объявленный класс . У них есть задача инициализировать элементы данных объекта и установить инвариант класса , но это не удается, если инвариант недействителен. Правильно написанный конструктор оставляет результирующий объект в допустимом состоянии. Неизменяемые объекты должны быть инициализированы в конструкторе.

Большинство языков допускают перегрузку конструктора, поскольку для класса может быть несколько конструкторов с разными параметрами. Некоторые языки принимают во внимание некоторые особые типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возврата нового экземпляра класса, абстрагируются фабриками , которые также создают объекты, но могут делать это различными способами, используя несколько классов или разные схемы распределения, такие как пул объектов .

Типы

Параметризованные конструкторы

Конструкторы, которые могут принимать хотя бы один аргумент, называются параметризованными конструкторами. Когда объект объявляется в параметризованном конструкторе, начальные значения должны быть переданы в качестве аргументов функции конструктора. Обычный способ объявления объекта может не работать. Конструкторы можно вызывать явно или неявно. Метод неявного вызова конструктора также называется сокращенным методом. Если мы хотим инициализировать поля класса вашими собственными значениями, используйте параметризованный конструктор.

class Example {
 public:
  Example();
  Example(int a, int b);  // Parameterized constructor.

 private:
  int x_;
  int y_;
};

Example::Example() = default;

Example::Example(int x, int y) : x_(x), y_(y) {}
Example e = Example(0, 50);  // Explicit call.
Example e2(0, 50);  // Implicit call.

Конструкторы по умолчанию

Если программист не предоставляет конструктор для экземпляра класса, компилятор Java вставляет конструктор по умолчанию в ваш код от вашего имени. Этот конструктор известен как конструктор по умолчанию. Вы не найдете его в исходном коде (файле java), поскольку он будет вставлен в код во время компиляции и существует в файле .class. Поведение конструктора по умолчанию зависит от языка. Он может инициализировать элементы данных нулевыми или другими одинаковыми значениями или вообще ничего не делать. В Java «конструктор по умолчанию» относится к конструктору с нулевым значением, который автоматически генерируется компилятором, если для класса не определены конструкторы или в отсутствие каких-либо конструкторов, определенных программистом (например, в Java конструктор по умолчанию неявно вызывает нулевого конструктора суперкласса, затем выполняет пустое тело). Для всех полей сохраняются начальные значения 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false (логический тип) или null (ссылочные типы).

#include <iostream>

class Student {
 public:
  Student(int a = 0, int b = 0);  // Default constructor.

  int a;
  int b;
};

Копировать конструкторы

Как и C ++, Java также поддерживает «Конструктор копирования». Но, в отличие от C ++, Java не создает конструктор копирования по умолчанию, если вы не пишете свой собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. У конструктора Copy есть один формальный параметр, который является типом класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Несмотря на то, что оба класса одинаковы, он считается конструктором преобразования. Хотя конструкторы копирования обычно сокращенно называются ctor или cctor, они не имеют ничего общего с конструкторами классов, используемыми в .NET, использующими то же сокращение.

Конструкторы преобразования

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

Конструкторы перемещения

В C ++ конструкторы перемещения принимают ссылку на значение объекта класса и используются для реализации передачи владения ресурсами объекта параметра.

Синтаксис

  • Java , C ++ , C # , ActionScript , PHP 4 и MATLAB имеют соглашение об именах, в котором конструкторы имеют то же имя, что и класс, с которым они связаны.
  • В PHP 5 рекомендуемое имя конструктора __construct. Для обратной совместимости будет вызываться метод с тем же именем, что и у класса, если __constructметод не может быть найден. Начиная с PHP 5.3.3, это работает только для классов без пространства имен.
  • В PHP 7 вы всегда должны называть конструктор как __construct. Методы с тем же именем, что и класс, вызовут ошибку уровня E_DEPRECATED.
  • В Perl конструкторы по соглашению называются «новыми» и должны создавать изрядное количество объектов.
  • В объектной системе Moose для Perl конструкторы (с именем new ) создаются автоматически и расширяются путем указания метода BUILD .
  • В Visual Basic .NET конструктор называется " New".
  • В Python конструктор разделен на два метода: « __new__» и « __init__». __new__Метод отвечает за выделение памяти для экземпляра, и принимает класс в качестве аргумента (обычно называемого " cls«). __init__Метод (часто называемый «инициализатором») передается вновь созданный экземпляр в качестве аргумента (обычно называемого " self«).
  • Конструкторы Object Pascal обозначаются ключевым словом " constructor" и могут иметь пользовательские имена (но чаще всего называются " Create").
  • В Objective-C метод конструктора разделен на два метода, " alloc" и " init", причем allocметод выделяет (выделяет) память для экземпляра класса, а initметод обрабатывает основную часть инициализации экземпляра. Вызов метода " new" вызывает как методы, так allocи initметоды для экземпляра класса.

Организация памяти

В Java, C # и VB .NET конструктор создает объекты ссылочного типа в специальной структуре памяти, называемой « кучей ». Типы значений (такие как int, double и т. Д.) Создаются в последовательной структуре, называемой « стеком ». VB .NET и C # также позволяют использовать новый оператор для создания объектов типа значения, но эти объекты типа значения создаются в стеке независимо от того, используется оператор или нет.

В C ++ объекты создаются в стеке, когда конструктор вызывается без оператора new, и создаются в куче, когда конструктор вызывается с оператором new. Объекты стека удаляются неявно, когда они выходят за пределы области видимости, в то время как объекты кучи должны быть удалены неявно с помощью деструктора или явно с помощью оператора удаления .

Сведения о языке

C ++

В C ++ имя конструктора - это имя класса. Он ничего не возвращает. У него могут быть параметры, как у любой функции-члена . Функции конструктора обычно объявляются в общедоступном разделе, но также могут быть объявлены в защищенном и закрытом разделах, если пользователь хочет ограничить доступ к ним.

Конструктор состоит из двух частей. Сначала идет список инициализаторов, который следует за списком параметров и перед телом метода. Он начинается с двоеточия, а записи разделяются запятыми. Список инициализаторов не требуется, но дает возможность предоставлять значения для элементов данных и избегать отдельных операторов присваивания. Список инициализаторов требуется, если у вас есть элементы данных константного или ссылочного типа или члены, не имеющие логики конструктора без параметров. Назначения происходят в соответствии с порядком, в котором объявлены элементы данных (даже если порядок в списке инициализаторов отличается). Вторая часть - это тело, которое представляет собой обычное тело метода, заключенное в фигурные скобки.

C ++ позволяет использовать более одного конструктора. Остальные конструкторы должны иметь другие параметры. Кроме того, конструкторы, которые содержат параметры, которым заданы значения по умолчанию, должны придерживаться ограничения, согласно которому не всем параметрам присваиваются значения по умолчанию. Это ситуация, которая имеет значение только при наличии конструктора по умолчанию. Конструктор базового класса (или базовых классов) также может вызываться производным классом. Функции-конструкторы не наследуются, и на их адреса нельзя ссылаться. Когда требуется выделение памяти, неявно вызываются операторы new и delete .

Конструктор копирования имеет параметр того же типа, который передается как ссылка на константу , например Vector (const Vector & rhs) . Если это не указано явно, компилятор использует конструктор копирования для каждой переменной-члена или просто копирует значения в случае примитивных типов. Реализация по умолчанию неэффективна, если класс имеет динамически выделяемые члены (или дескрипторы для других ресурсов), потому что это может привести к двойным вызовам удаления (или двойному освобождению ресурсов) после уничтожения.

class Foobar {
 public:
  Foobar(double r = 1.0,
         double alpha = 0.0)  // Constructor, parameters with default values.
      : x_(r * cos(alpha))    // <- Initializer list
  {
    y_ = r * sin(alpha);  // <- Normal assignment
  }

 private:
  double x_;
  double y_;
};

Примеры вызовов:

Foobar a,
       b(3),
       c(5, M_PI/4);

При возврате объектов из функций или передаче объектов по значению конструктор копирования объектов будет вызываться неявно, если не применяется оптимизация возвращаемого значения .

C ++ неявно генерирует конструктор копирования по умолчанию, который будет вызывать конструкторы копирования для всех базовых классов и всех переменных-членов, если программист не предоставит его, явно удаляет конструктор копирования (для предотвращения клонирования) или один из базовых классов или конструктор копирования переменных-членов удаляется или недоступен (частный). В большинстве случаев, когда требуется настраиваемый конструктор копирования (например, подсчет ссылок , глубокая копия указателей), также требуется настройка деструктора и оператора присваивания копии . Это обычно называют Правилом трех .

C #

Пример конструктора C # :

public class MyClass
{
    private int a;
    private string b;

    // Constructor
    public MyClass() : this(42, "string")
    {
    }

    // Overloading a constructor
    public MyClass(int a, string b)
    {
        this.a = a;
        this.b = b;
    }
}
// Code somewhere
// Instantiating an object with the constructor above
MyClass c = new MyClass(42, "string");

Статический конструктор C #

В C # , A статический конструктор является инициализатором статического данные. Статические конструкторы также называются конструкторами классов . Поскольку фактически сгенерированный метод имеет имя .cctor, их часто также называют "cctors".

Статические конструкторы позволяют инициализировать сложную статическую переменную. Статические конструкторы вызываются неявно при первом обращении к классу. Любой вызов класса (статический вызов или вызов конструктора) запускает выполнение статического конструктора. Статические конструкторы являются потокобезопасными и реализуют одноэлементный шаблон . При использовании в универсальном классе программирования статические конструкторы вызываются при каждом новом создании универсального экземпляра, по одному для каждого типа. Также создаются статические переменные.

public class MyClass
{
    private static int _A;

    // Normal constructor
    static MyClass()
    {
        _A = 32;
    }

    // Standard default constructor
    public MyClass()
    {

    }
}
// Code somewhere
// Instantiating an object with the constructor above
// right before the instantiation
// The variable static constructor is executed and _A is 32
MyClass c = new MyClass();

CFML

CFML использует метод с именем " init" как метод конструктора.

Cheese.cfc

component {
   // properties
   property name="cheeseName";

   // constructor
   function Cheese init( required string cheeseName ) {
      variables.cheeseName = arguments.cheeseName;
      return this;
   }
}

Создайте экземпляр сыра.

myCheese = new Cheese( 'Cheddar' );

Начиная с ColdFusion 10, CFML также поддерживает указание имени метода конструктора:

component initmethod="Cheese" {
   // properties
   property name="cheeseName";

   // constructor
   function Cheese Cheese( required string cheeseName ) {
      variables.cheeseName = arguments.cheeseName;
      return this;
   }
}

Эйфелева

В Eiffel процедуры инициализации новых объектов называются процедурами создания . Процедуры создания имеют следующие особенности:

  • Процедуры создания не имеют явного возвращаемого типа (по определению процедуры ).
  • Названы процедуры создания.
  • Процедуры создания обозначаются по имени как процедуры создания в тексте класса.
  • Процедуры создания могут быть явно вызваны для повторной инициализации существующих объектов.
  • Каждый эффективный (т.е. конкретный или не абстрактный) класс должен обозначать как минимум одну процедуру создания.
  • Процедуры создания должны оставлять вновь инициализированный объект в состоянии, удовлетворяющем инварианту класса.

Хотя создание объекта связано с некоторыми тонкостями, создание атрибута с типичным объявлением, x: Tвыраженным в инструкции по созданию, create x.makeсостоит из следующей последовательности шагов:

  • Создайте новый прямой экземпляр типа T.
  • Выполните процедуру создания makeдля вновь созданного экземпляра.
  • Присоедините вновь инициализированный объект к сущности x.

В первом фрагменте ниже POINTопределен класс . Процедура makeкодируется после ключевого слова feature.

Ключевое слово createвводит список процедур, которые можно использовать для инициализации экземпляров. В этом случае список включает default_createпроцедуру с пустой реализацией, унаследованной от класса ANY, и makeпроцедуру, закодированную внутри класса.

class
    POINT
create
    default_create, make

feature

    make (a_x_value: REAL; a_y_value: REAL)
        do
            x := a_x_value
            y := a_y_value
        end

    x: REAL
            -- X coordinate

    y: REAL
            -- Y coordinate
        ...

Во втором фрагменте класс, который является клиентом, POINTимеет объявления my_point_1и my_point_2тип POINT.

В процедурном коде my_point_1создается как источник (0,0, 0,0). Поскольку процедура создания не указана, используется процедура, default_createунаследованная от класса ANY. Эта строка могла быть закодирована create my_point_1.default_create. В инструкции с createключевым словом могут использоваться только процедуры, названные процедурами создания . Далее идет инструкция по созданию my_point_2, предоставляющая начальные значения для my_point_2координат. Третья инструкция выполняет обычный вызов экземпляра makeпроцедуры для повторной инициализации экземпляра, присоединенного к нему, my_point_2с другими значениями.

    my_point_1: POINT
    my_point_2: POINT
        ...

            create my_point_1
            create my_point_2.make (3.0, 4.0)
            my_point_2.make (5.0, 8.0)
        ...

F #

В F # конструктор может включать любые операторы letили, doопределенные в классе. letоператоры определяют закрытые поля, а doоператоры выполняют код. Дополнительные конструкторы можно определить с помощью newключевого слова.

type MyClass(_a : int, _b : string) = class
    // Primary constructor
    let a = _a
    let b = _b
    do printfn "a = %i, b = %s" a b

    // Additional constructors
    new(_a : int) = MyClass(_a, "") then
        printfn "Integer parameter given"

    new(_b : string) = MyClass(0, _b) then
        printfn "String parameter given"

    new() = MyClass(0, "") then
        printfn "No parameter given"
end
// Code somewhere
// instantiating an object with the primary constructor
let c1 = new MyClass(42, "string")

// instantiating an object with additional constructors
let c2 = new MyClass(42)
let c3 = new MyClass("string")
let c4 = MyClass() // "new" keyword is optional

Джава

В Java конструкторы отличаются от других методов тем, что:

  • Конструкторы никогда не имеют явного возвращаемого типа.
  • Конструкторы не могут быть вызваны напрямую (их вызывает ключевое слово « new»).
  • У конструкторов не должно быть модификаторов, запрещающих доступ.

Конструкторы Java выполняют следующие задачи в следующем порядке:

  1. Вызовите конструктор суперкласса по умолчанию, если конструктор не определен.
  2. Инициализируйте переменные-члены указанными значениями.
  3. Выполняет тело конструктора.

Java разрешает пользователям вызывать один конструктор в другом конструкторе с помощью this()ключевого слова. Но this()должно быть первое заявление.

class Example
{ 
    Example() // Non-parameterized constructor
    {
        this(1);  // Calling of constructor
        System.out.println("0-arg-cons");
    }
    Example(int a) // Parameterized constructor
    {
        System.out.println("1-arg-cons");
    }
}
public static void main(String[] args)
{
  Example e = new Example();
}

Java предоставляет доступ к конструктору суперкласса через superключевое слово.

public class Example
{
    // Definition of the constructor.
    public Example()
    {
        this(1);
    }

    // Overloading a constructor
    public Example(int input)
    {
        data = input; // This is an assignment
    }

    // Declaration of instance variable(s).
    private int data;
}
// Code somewhere else
// Instantiating an object with the above constructor
Example e = new Example(42);

Конструктор, принимающий нулевое количество аргументов, называется конструктором без аргументов или без аргументов.

JavaScript

Начиная с ES6, в JavaScript есть прямые конструкторы, как и во многих других языках программирования. Они написаны как таковые

class FooBar {
  constructor(baz) {
    this.baz = baz
  }
}

Это может быть создано как таковое

const foo = new FooBar('7')

Эквивалентом этого до ES6 было создание функции, которая создает экземпляр объекта как такового.

function FooBar (baz) {
  this.baz = baz;
}

Это создается так же, как указано выше.

Object Pascal

В Object Pascal конструктор похож на фабричный метод . Единственное синтаксическое отличие от обычных методов - это ключевое слово constructorперед именем (вместо procedureили function). Он может иметь любое имя, хотя по соглашению используется Createпрефикс, например in CreateWithFormatting. Создание экземпляра класса работает как вызов статического метода класса: TPerson.Create('Peter').

program OopProgram;

type
  TPerson = class
  private
    FName: string;
  public
    property Name: string read FName;
    constructor Create(AName: string);
  end;

constructor TPerson.Create(AName: string);
begin
  FName := AName;
end;

var
  Person: TPerson;
begin
  Person := TPerson.Create('Peter'); // allocates an instance of TPerson and then calls TPerson.Create with the parameter AName = 'Peter'
end.

OCaml

В OCaml есть один конструктор. Параметры определяются сразу после имени класса. Они могут использоваться для инициализации переменных экземпляра и доступны для всего класса. Вызываемый анонимный скрытый метод initializerпозволяет оценить выражение сразу после создания объекта.

class person first_name last_name =
  object
    val full_name = first_name ^ " " ^ last_name

    initializer
      print_endline("Hello there, I am " ^ full_name ^ ".")

    method get_last_name = last_name
  end;;

let alonzo = new person "Alonzo" "Church" in (*Hello there, I am Alonzo Church.*)

print_endline alonzo#get_last_name (*Church*)

PHP

В PHP версии 5 и выше конструктором является метод с именем __construct()(обратите внимание, что это двойное подчеркивание), который ключевое слово newавтоматически вызывает после создания объекта. Обычно он используется для автоматического выполнения инициализации, такой как инициализация свойств. Конструкторы также могут принимать аргументы, и в этом случае, когда newоператор написан, вам также необходимо отправить аргументы конструктора для параметров.

class Person
{
    private string $name;

    public function __construct(string $name): void
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }
}

Perl 5

В языке программирования Perl версии 5 по умолчанию конструкторы являются фабричными методами , то есть методами, которые создают и возвращают объект, что конкретно означает создание и возврат благословенной ссылки. Типичный объект - это ссылка на хэш, хотя ссылки на другие типы также используются редко. По соглашению единственный конструктор называется новым , хотя ему разрешено называть его иначе или иметь несколько конструкторов. Например, класс Person может иметь конструктор с именем new, а также конструктор new_from_file, который считывает файл для атрибутов Person, и new_from_person, который использует другой объект Person в качестве шаблона.

package Person;
# In Perl constructors are named 'new' by convention.
sub new {
    # Class name is implicitly passed in as 0th argument.
    my $class = shift;

    # Default attribute values, if you have any.
    my %defaults = ( foo => "bar" );

    # Initialize attributes as a combination of default values and arguments passed.
    my $self = { %defaults, @_ };

    # Check for required arguments, class invariant, etc.
    if ( not defined $self->{first_name} ) {
        die "Mandatory attribute missing in Person->new(): first_name";
    }
    if ( not defined $self->{last_name} ) {
        die "Mandatory attribute missing in Person->new(): last_name";
    }
    if ( defined $self->{age} and $self->{age} < 18 ) {
        die "Invalid attribute value in Person->new(): age < 18";
    }

    # Perl makes an object belong to a class by 'bless'.
    bless $self, $class;
    return $self;
}
1;

Perl 5 с Moose

В объектной системе Moose для Perl большую часть этого шаблона можно исключить, создать новый по умолчанию , можно указать атрибуты, а также указать, могут ли они быть установлены, сброшены или являются обязательными. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD, который сгенерированный конструктор Moose вызовет после проверки аргументов. Можно указать метод BUILDARGS для обработки аргументов конструктора не в форме hashref / key => value.

package Person;
# enable Moose-style object construction
use Moose;

# first name ( a string) can only be set at construction time ('ro')
has first_name => (is => 'ro', isa => 'Str', required => 1);
# last name ( a string) can only be set at construction time ('ro')
has last_name  => (is => 'ro', isa => 'Str', required => 1);
# age (Integer) can be modified after construction ('rw'), and is not required
# to be passed to be constructor.  Also creates a 'has_age' method which returns
# true if age has been set
has age        => (is => 'rw', isa => 'Int', predicate => 'has_age');

# Check custom requirements
sub BUILD {
      my $self = shift;
      if ($self->has_age && $self->age < 18) { # no under 18s
           die "No under-18 Persons";
      }
}
1;

В обоих случаях класс Person создается следующим образом:

use Person;
my $p = Person->new( first_name => 'Sam', last_name => 'Ashe', age => 42 );

Python

В Python , конструкторы определяются одним или обоими __new__и __init__методов. Новый экземпляр создается путем вызова класса , как если бы это была функция, которая вызывает __new__и __init__методы. Если метод конструктора не определен в классе, будет вызван следующий метод, найденный в порядке разрешения метода класса .

В типичном случае __init__необходимо определить только метод. (Наиболее частое исключение - неизменяемые объекты.)

>>> class ExampleClass:
...     def __new__(cls, value):
...         print("Creating new instance...")
...         # Call the superclass constructor to create the instance.
...         instance = super(ExampleClass, cls).__new__(cls)
...         return instance
...     def __init__(self, value):
...         print("Initialising instance...")
...         self.payload = value
>>> exampleInstance = ExampleClass(42)
Creating new instance...
Initialising instance...
>>> print(exampleInstance.payload)
42

Классы обычно действуют как фабрики для новых экземпляров самих себя, то есть класс - это вызываемый объект (например, функция), при этом вызов является конструктором, а вызов класса возвращает экземпляр этого класса. Однако __new__методу разрешено возвращать что-то, кроме экземпляра класса для специализированных целей. В этом случае __init__не вызывается.

Раку

С Ракой , еще более шаблонным может быть опущено, если учесть , что по умолчанию новый метод наследуется, атрибуты могут быть определены, а также могут ли они быть установлены, сброшены, или требуются. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD, который будет вызываться для обеспечения возможности индивидуальной инициализации. TWEAK , метод может быть определен , чтобы после процесса любые атрибуты уже (неявно) инициализируется.

class Person {
    has Str $.first-name is required; # First name (a string) can only be set at
                                      # construction time (the . means "public").
    has Str $.last-name is required;  # Last name (a string) can only be set at
                                      # construction time (a ! would mean "private").
    has Int $.age is rw;              # Age (an integer) can be modified after 
                                      # construction ('rw'), and is not required
                                      # during the object instantiation.
    
    # Create a 'full-name' method which returns the person's full name.
    # This method can be accessed outside the class.
    method full-name { $!first-name.tc ~ " " ~ $!last-name.tc }

    # Create a 'has-age' method which returns true if age has been set.
    # This method is used only inside the class so it's declared as "private"
    # by prepending its name with a !
    method !has-age { self.age.defined }
  
    # Check custom requirements
    method TWEAK {
        if self!has-age && $!age < 18 { # No under 18
            die "No person under 18";
        }
    }
}

Класс Person создается следующим образом:

my $p0 = Person.new( first-name => 'Sam', last-name => 'Ashe', age => 42 );
my $p1 = Person.new( first-name => 'grace', last-name => 'hopper' );
say $p1.full-name(); # OUTPUT: «Grace Hopper␤»

В качестве альтернативы именованные параметры могут быть указаны с использованием синтаксиса пары двоеточий в Perl 6:

my $p0 = Person.new( :first-name<Sam>, :last-name<Ashe>, :age(42) );
my $p1 = Person.new( :first-name<Grace>, :last-name<Hopper> );

И если вы установили переменные с именами, идентичными именованным параметрам, вы можете использовать ярлык, который будет использовать имя переменной для именованного параметра:

my $first-name = "Sam";
my $last-name  = "Ashe";
my $age        = 42;
my $p0 = Person.new( :$first-name, :$last-name, :$age );

Рубин

В Ruby конструкторы создаются путем определения вызываемого метода initialize. Этот метод выполняется для инициализации каждого нового экземпляра.

irb(main):001:0> class ExampleClass
irb(main):002:1>   def initialize
irb(main):003:2>     puts "Hello there"
irb(main):004:2>   end
irb(main):005:1> end
=> nil
irb(main):006:0> ExampleClass.new
Hello there
=> #<ExampleClass:0x007fb3f4299118>

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
' code somewhere else
' instantiating an object with the above constructor
Dim foo As New Foobar(".NET")

Смотрите также

Примечания

использованная литература