Конструкторы при наследовании c#

Конструкторы и наследование

В иерархии классов допускается, чтобы у базовых и производных классов были свои собственные конструкторы. В связи с этим возникает следующий резонный вопрос: какой конструктор отвечает за построение объекта производного класса: конструктор базового класса, конструктор производного класса или же оба? На этот вопрос можно ответить так: конструктор базового класса конструирует базовую часть объекта, а конструктор производного класса — производную часть этого объекта. И в этом есть своя логика, поскольку базовому классу неизвестны и недоступны любые элементы производного класса, а значит, их конструирование должно происходить раздельно.

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

Когда конструкторы определяются как в базовом, так и в производном классе, процесс построения объекта несколько усложняется, поскольку должны выполняться конструкторы обоих классов. В данном случае приходится обращаться к ключевому слову base, которое находит двоякое применение: во-первых, для вызова конструктора базового класса; и во-вторых, для доступа к члену базового класса, скрывающегося за членом производного класса.

С помощью формы расширенного объявления конструктора производного класса и ключевого слова base в производном классе может быть вызван конструктор, определенный в его базовом классе. Ниже приведена общая форма этого расширенного объявления:

где список_аргументов обозначает любые аргументы, необходимые конструктору в базовом классе. Обратите внимание на местоположение двоеточия.

Давайте рассмотрим пример:

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

А теперь рассмотрим вкратце основные принципы действия ключевого слова base. Когда в производном классе указывается ключевое слово base, вызывается конструктор из его непосредственного базового класса. Следовательно, ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. Это справедливо даже для многоуровневой иерархии классов. Аргументы передаются базовому конструктору в качестве аргументов метода base(). Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию.

Конструкторы при наследовании C#

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

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

Что делать, если необходимо использование для базового класса конструктора с параметрами?

В этом случае нужно обязательно написать конструктор производного класса и в описании этого конструктора включить дополнительную запись. После имени конструктора в его описании поставить двоеточие, затем, написать ключевое слово base и в скобках значения параметров.

public C(int xx):base(xx) <>

В С# нет множественного наследования классов, т.е. для у любого производного класса базовый класс всегда один. Сам базовый класс может быть производным от некоторого другого класса.

В качестве базовых типов могут выступать интерфейсы, в этом случае класс может быть наследником многих интерфейсов.

Некоторые авторы определяют наследование, как создание нового класса на основе существующих. В этом случае, агрегация также подпадает под определение наследования, и ее называют наследованием по модели включение-делегирование.

Запрет наследования: классы объявленные как sealed

В некоторых случаях требуется запретить создание производных классов. Разработчики хотят, чтобы класс использовался только в том виде, в каком он создан, в этом случае ключевое слово sealed.

Класс String пространства имен System является закрытым для наследования.

Замечание: слово sealed не запрещает агрегацию.

Использование конструкторов (Руководство по программированию на C#) Using Constructors (C# Programming Guide)

В этой статье

Каждый раз, когда создается класс или структура, вызывается конструктор. When a class or struct is created, its constructor is called. Конструкторы имеют имя, совпадающее с именем класса или структуры, и обычно инициализируют члены данных нового объекта. Constructors have the same name as the class or struct, and they usually initialize the data members of the new object.

В следующем примере класс с именем Taxi определяется с помощью простого конструктора. In the following example, a class named Taxi is defined by using a simple constructor. Затем оператор new создает экземпляр этого класса. This class is then instantiated with the new operator. Конструктор Taxi вызывается оператором new сразу после того, как новому объекту будет выделена память. The Taxi constructor is invoked by the new operator immediately after memory is allocated for the new object.

Конструктор, который не принимает никаких параметров, называется конструктором по умолчанию. A constructor that takes no parameters is called a default constructor. Конструкторы по умолчанию вызываются всякий раз, когда создается экземпляр объекта с помощью оператора new , а аргументы в new не передаются. Default constructors are invoked whenever an object is instantiated by using the new operator and no arguments are provided to new . Дополнительные сведения см. в разделе Конструкторы экземпляров. For more information, see Instance Constructors.

Если класс является статическим, компилятор C# выделяет классам без конструкторов открытый конструктор по умолчанию, позволяющий создавать экземпляры классов. Unless the class is static, classes without constructors are given a public default constructor by the C# compiler in order to enable class instantiation. Дополнительные сведения см. в статье Статические классы и члены статических классов. For more information, see Static Classes and Static Class Members.

Создание экземпляров класса можно запретить, сделав конструктор закрытым, следующим образом: You can prevent a class from being instantiated by making the constructor private, as follows:

Дополнительные сведения см. в разделе Закрытые конструкторы. For more information, see Private Constructors.

Конструкторы для типов struct похожи на конструкторы классов, однако structs не может содержать явный конструктор по умолчанию, поскольку предоставляется компилятором автоматически. Constructors for struct types resemble class constructors, but structs cannot contain an explicit default constructor because one is provided automatically by the compiler. Этот конструктор инициализирует каждое поле в struct со значением по умолчанию. This constructor initializes each field in the struct to the default values. Дополнительные сведения см. в разделе Таблица значений по умолчанию. For more information, see Default Values Table. При этом конструктор по умолчанию вызывается только в том случае, если struct создается с помощью переменной new . However, this default constructor is only invoked if the struct is instantiated with new . Например, в этом коде конструктор по умолчанию используется для Int32 — это обеспечивает инициализацию целого числа: For example, this code uses the default constructor for Int32, so that you are assured that the integer is initialized:

В то же время следующий код вызывает ошибку компилятора, поскольку не использует new , и потому, что использует не инициализированный объект: The following code, however, causes a compiler error because it does not use new , and because it tries to use an object that has not been initialized:

Кроме того, объекты на основе structs (включая все встроенные числовые типы) можно инициализировать или назначить, а затем использовать, как в следующем примере: Alternatively, objects based on structs (including all built-in numeric types) can be initialized or assigned and then used as in the following example:

В связи с этим вызывать конструктор по умолчанию для типа значения необязательно. So calling the default constructor for a value type is not required.

Оба класса и structs могут определять конструкторы, принимающие параметры. Both classes and structs can define constructors that take parameters. Конструкторы, принимающие параметры, необходимо вызывать с помощью оператора new или base. Constructors that take parameters must be called through a new statement or a base statement. Классы и structs могут определять также несколько конструкторов; для определения конструктора по умолчанию ни один их них не требуется. Classes and structs can also define multiple constructors, and neither is required to define a default constructor. Пример: For example:

Этот класс можно создать, воспользовавшись одним из следующих операторов: This class can be created by using either of the following statements:

Конструктор может использовать ключевое слово base для вызова конструктора базового класса. A constructor can use the base keyword to call the constructor of a base class. Пример: For example:

В этом примере конструктор базового класса вызывается перед выполнением соответствующего ему блока. In this example, the constructor for the base class is called before the block for the constructor is executed. Ключевое слово base можно использовать как с параметрами, так и без них. The base keyword can be used with or without parameters. Любые параметры для конструктора можно использовать как параметры для base или как часть выражения. Any parameters to the constructor can be used as parameters to base , or as part of an expression. Дополнительные сведения см. в разделе base. For more information, see base.

В производном классе, если конструктор базового класса не вызывается явным образом с помощью ключевого слова base , конструктор по умолчанию, если он существует, вызывается неявно. In a derived class, if a base-class constructor is not called explicitly by using the base keyword, the default constructor, if there is one, is called implicitly. Это означает, что следующие объявления конструкторов действуют одинаково: This means that the following constructor declarations are effectively the same:

Если базовый класс не предлагает конструктор по умолчанию, производный класс должен явно вызвать конструктор базового класса с помощью base . If a base class does not offer a default constructor, the derived class must make an explicit call to a base constructor by using base .

Конструктор может вызывать другой конструктор в том же объекте с помощью ключевого слова this. A constructor can invoke another constructor in the same object by using the this keyword. Как и base , this можно использовать с параметрами или без, а все параметры в конструкторе доступны как параметры this или как часть выражения. Like base , this can be used with or without parameters, and any parameters in the constructor are available as parameters to this , or as part of an expression. Например, второй конструктор в предыдущем примере можно переписать, используя this : For example, the second constructor in the previous example can be rewritten using this :

Применение ключевого слова this в приведенном выше примере привело к вызову конструктора: The use of the this keyword in the previous example causes this constructor to be called:

Конструкторы могут иметь пометку public, private, protected, internal, protected internal или private protected. Constructors can be marked as public, private, protected, internal, protected internal or private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут создавать класс. These access modifiers define how users of the class can construct the class. Дополнительные сведения см. в статье Модификаторы доступа. For more information, see Access Modifiers.

Конструктор можно объявить статическим, используя ключевое слово static. A constructor can be declared static by using the static keyword. Статические конструкторы вызываются автоматически непосредственно перед доступом к статическим полям и обычно используются для инициализации членов статического класса. Static constructors are called automatically, immediately before any static fields are accessed, and are generally used to initialize static class members. Дополнительные сведения см. в разделе Статические конструкторы. For more information, see Static Constructors.

Спецификация языка C# C# Language Specification

Дополнительные сведения см. в спецификации языка C#. For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#. The language specification is the definitive source for C# syntax and usage.

Конструкторы экземпляров (Руководство по программированию в C#) Instance Constructors (C# Programming Guide)

В этой статье

Конструкторы экземпляров используются для создания и инициализации переменных члена экземпляра, если создание объекта class осуществляется с помощью выражения new. Instance constructors are used to create and initialize any instance member variables when you use the new expression to create an object of a class. Для инициализации класса static или статических переменных в нестатическом классе необходимо определить статический конструктор. To initialize a static class, or static variables in a non-static class, you must define a static constructor. Дополнительные сведения см. в разделе Статические конструкторы. For more information, see Static Constructors.

В следующем примере показан конструктор экземпляра. The following example shows an instance constructor:

Для ясности этот класс содержит открытые поля. For clarity, this class contains public fields. Открытые поля не рекомендуется использовать на практике, поскольку в этом случае любой метод в любом месте программы получает неограниченный и неконтролируемый доступ к внутренней работе объекта. The use of public fields is not a recommended programming practice because it allows any method anywhere in a program unrestricted and unverified access to an object’s inner workings. Члены данных обычно должны быть закрытыми, а доступ к ним должен осуществляться только посредством методов и свойства класса. Data members should generally be private, and should be accessed only through class methods and properties.

Этот конструктор экземпляра вызывается каждый раз при создании объекта на базе класса CoOrds . This instance constructor is called whenever an object based on the CoOrds class is created. Такой конструктор без аргументов называется конструктором по умолчанию. A constructor like this one, which takes no arguments, is called a default constructor. Зачастую такие конструкторы используются для предоставления дополнительных конструкторов. However, it is often useful to provide additional constructors. Например, можно добавить конструктор в класс CoOrds , позволяющий указывать начальные значения для членов данных: For example, we can add a constructor to the CoOrds class that allows us to specify the initial values for the data members:

Это позволяет создавать объекты CoOrd с начальными значениями по умолчанию или с другими начальными значениями: This allows CoOrd objects to be created with default or specific initial values, like this:

Если класс не содержит конструктор, автоматически создается конструктор по умолчанию, и для инициализации полей объекта используются значения по умолчанию. If a class does not have a constructor, a default constructor is automatically generated and default values are used to initialize the object fields. Например, int инициализируется значением 0. For example, an int is initialized to 0. Дополнительные сведения о значениях по умолчанию см. в разделе Таблица значений по умолчанию. For more information on default values, see Default Values Table. Следовательно, поскольку конструктор по умолчанию класса CoOrds инициализирует все члены данных с нулевыми значениями, его можно удалить, при этом порядок работы класса не изменится. Therefore, because the CoOrds class default constructor initializes all data members to zero, it can be removed altogether without changing how the class works. Полный пример использования нескольких конструкторов см. в данном разделе в примере 1; пример автоматически созданного конструктора см. в примере 2. A complete example using multiple constructors is provided in Example 1 later in this topic, and an example of an automatically generated constructor is provided in Example 2.

Конструкторы экземпляров также можно использовать для вызова конструкторов экземпляров базового класса. Instance constructors can also be used to call the instance constructors of base classes. Конструктор класса может вызвать конструктор базового класса с помощью инициализатора: The class constructor can invoke the constructor of the base class through the initializer, as follows:

В этом примере класс Circle передает значения радиуса и высоты конструктору, предоставленному классом Shape , для которого класс Circle является производным. In this example, the Circle class passes values representing radius and height to the constructor provided by Shape from which Circle is derived. Полный текст кода с использованием классов Shape и Circle см. в данном разделе в примере 3. A complete example using Shape and Circle appears in this topic as Example 3.

Пример 1 Example 1

В следующем примере демонстрируется класс с двумя конструкторами, один из которых не имеет аргументов, а второй имеет два аргумента. The following example demonstrates a class with two class constructors, one without arguments and one with two arguments.

Пример 2 Example 2

В этом примере класс Person не имеет конструкторов, поэтому автоматически предоставляется конструктор по умолчанию, а все поля инициализируются со значениями по умолчанию. In this example, the class Person does not have any constructors, in which case, a default constructor is automatically provided and the fields are initialized to their default values.

Обратите внимание, что значение по умолчанию age равно 0 , а значение по умолчанию name равно null . Notice that the default value of age is 0 and the default value of name is null . Дополнительные сведения о значениях по умолчанию см. в разделе Таблица значений по умолчанию. For more information on default values, see Default Values Table.

Пример 3 Example 3

В следующем примере демонстрируется использование инициализатора базового класса. The following example demonstrates using the base class initializer. Класс Circle является производным от основного класса Shape , а класс Cylinder является производным от класса Circle . The Circle class is derived from the general class Shape , and the Cylinder class is derived from the Circle class. Конструктор каждого производного класса использует инициализатор своего базового класса. The constructor on each derived class is using its base class initializer.

Дополнительные примеры вызова конструкторов базовых классов см. в разделах virtual, override и base. For more examples on invoking the base class constructors, see virtual, override, and base.

См. также See Also

Обратная связь

Мы бы хотели узнать ваше мнение. Укажите, о чем вы хотите рассказать нам.

Наша новая система обратной связи основана на принципах работы с вопросами на GitHub. Прочтите об этом изменении в нашей записи блога.

Конструкторы класса, наследование

Доброго времени суток, форумчане!
Создал класс и несколько производных от него. В некоторых классах (circle, rectangle) появилась необходимость объявить не один, а два конструктора с разными параметрами, и вот с ними возникла проблема — выдаёт ошибку (класс rectangle, конструктор public rectangle (point x, double w, double h)). Не пойму почему, объясните пожалуйста.

А ещё в функциях «mov» пишет предупреждение «скрывает наследуемый член». То же не понимаю что это значит и как это устранить. Объясните пожалуйста.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Наследование и пустые конструкторы
В общем, вопрос связан с наследованием. Есть два главный класс рисования. От.

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

Наследование от protected класса: будут ли public члены класса Б доступны классу А
Добрый день! Если пронаследовать public класс А от protected класса Б, будут.

Создать конструкторы для класса
Уважаемые форумчане! Нужна помощь с реализацией конструкторов для класса.

Наследование в класса от другого класса и интерфейса
Здравствуйте. Есть интерфейс public interface comp < void.

Может потому что переменные x и y в классе rectangle не объявлены ?
Следует публиковать текст ошибки, это на будущее .

Добавлено через 4 минуты
Или ссылочный тип нужно объявлять в параметрах (в стр.83)

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

Подскажите как это правильней описать.

Добавлено через 10 часов 20 минут

Почему мы должны здесь вызывать конструктор класса point, ведь данная точка будет создаваться вне класса с помощью конструктора point и передаваться?

Почему не причём, мы же их используем в конструкторе rectangle, а потом в классе square?

Даценд, подскажите как правильней будет описать наследование в данном случае.

В данном случае, по моему мнению, наследование не нужно.

Добавлено через 14 минут
Классы circle, rectangle и square в качестве одного из полей используют объект класса point. Если использовать наследование от point, то это будет так же смотреться, как наследование класса «Автомобиль» от класса «Номер автомобиля», или от класса «Руль».
Если нужно объекты этих классов собрать в одну коллекцию, то объявите интерфейс IMoveble, в котором объявите метод Mov. А в классах этот интерфейс реализуйте. Тогда объекты классов circle, rectangle и square можно будет записывать в коллекцию типа интерфейса IMoveble.

Еще по теме:

  • Наследование c++ или Наследование c++ или Видно, что он объект класса Derived содержит внутри себя объект класса Base . Для того, чтобы создать объект Derived , нужно сначала создать Base . new Derived(); // отвести место в памяти под объект Derived и вызвать его конструктор Рассмотрим реализацию […]
  • В негласное правило В негласное правило Гласные и негласные правила Правила, которые устанавливают для нас родители, происходят из их убеждений. Так же, как и сами убеждения, их манифестации правила, эволюционируют со временем. Правила это принуждение: «да» и «нет», «сделай это», «не делай этого». Например, […]
  • Как принять гражданство россии Гражданство РФ для иностранных граждан: как получить российское гражданство иностранному гражданину, основания и документы на гражданство РФ, упрощенное получение гражданства РФ – пошаговая инструкция и порядок приобретения российского гражданства Гражданство РФ – это устойчивая […]
  • Пленум верховного суда по находке Сам себе адвокат Присвоение найденного УК РФ Присвоение найденного УК РФ Присвоение найденного часто встречается в судебной и следственной практике, однако эта практика неоднозначна. Одной из причин, существующей сегодня противоречивой судебной практике, является то, что в УК РФ […]
  • Бухпроводки по претензиям Учет расчетов по претензиям на счете 76.2 (с примерами) 76 счет бухгалтерского учета «Расчеты с разными дебиторами и кредиторами» имеет несколько субсчетов, на каждом из которых происходит учет определенных операций. На субсчете 1 учитывается имущественное и личное страхование, подробно […]
  • Письмо ходатайство на визу Составление и написание мотивационного письма в посольство Составление мотивационного письма – это важный шаг в жизни любого человека. Если вы взялись за его составление, то это значит, что вы хотите внести некоторые изменения в вашу жизнь. Такой документ вам так же понадобится при […]
  • Общая сумма налога и налоговых вычетов Налоговые вычеты для физических лиц Разделы: Задумывались ли вы над тем, какую сумму от своей заработной платы вы ежегодно отдаете в доход государства? Как известно, помимо перечисления сборов в ПФР, ФСС России и ФФОМС (в размере 30% от размера заработной платы работника), работодатель […]
  • Сколько раз можно жениться по закону в россии Сколько раз можно выходить замуж по закону? Юридическая точка зрения: сколько раз выходят по закону замуж? Количество браков не ограничено, и в России нет такого закона, который бы затрагивал этот вопрос хоть в какой-то мере. Никто не может запретить женщине выйти замуж в очередной раз. […]