Что на самом деле базовое ключевое слово делает в инициализации конструктора?

Я был смущен ключевым словом base в С#. Скажем, у меня есть такой код:

​class A
{
 ​// member declaration....
 A(int s, int t, int x)
 {
 ​// assign the values of members
 }
}
class B : A
{
 // member declaration....
 ​B(int a, int b, int c, int d) : base(a,b,c)
 {
 // does the base keyword play a role in
 // this constructor?
 }
}
​

Теперь, каково точное использование ключевого слова base в конструкторе B? У меня мало вопросов, чтобы уточнить:

  • Использование ключевого слова base будет вызывать конструктор базового класса A (в нашем примере)? Правильно ли это?
  • Предоставление ключевого слова base в производном классе изменяет поведение конструктора производного класса?

И в основном, когда в конструкторе должно использоваться base ключевое слово (некоторые примеры будут хорошими)?

Edit:

У меня есть другой вопрос. Как я могу сообщить классу base о нашем классе derived с помощью ключевого слова base?

Спасибо заранее.

3 ответа

Да - base цепочки к конструктору в базовом классе.

Если вы не укажете base или this (чтобы привязать к другому конструктору в том же классе), эффект будет таким, как если бы вы имели цепочку base() для конструктора без параметров в базовом классе. В вашем примере это приведет к сбою компиляции, так как ваш базовый класс не имеет конструктора без параметров.

Дополнительную информацию см. в статье о конструкторах.


Я думаю, что руководство довольно ясно на base:

Ключевое слово base используется для доступа к членам базового класса из производного класса:

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

  • Укажите, какой конструктор базового класса следует вызывать при создании экземпляров производного класса.

public class BaseClass
{
 int num;
 public BaseClass()
 {
 Console.WriteLine("in BaseClass()");
 }
 public BaseClass(int i)
 {
 num = i;
 Console.WriteLine("in BaseClass(int i)");
 }
 public int GetNum()
 {
 return num;
 }
}
public class DerivedClass : BaseClass
{
 // This constructor will call BaseClass.BaseClass()
 public DerivedClass() : base()
 {
 }
 // This constructor will call BaseClass.BaseClass(int i)
 public DerivedClass(int i) : base(i)
 {
 }
 static void Main()
 {
 DerivedClass md = new DerivedClass();
 DerivedClass md1 = new DerivedClass(1);
 }
}
/*
Output:
in BaseClass()
in BaseClass(int i)
*/


  • Да, это вызывает конструктор базового класса.

  • Производный конструктор всегда вызывает конструктор базового класса; если вы его не укажете, он попытается вызвать конструктор без параметров (если он существует). Этот синтаксис позволяет передавать параметры конкретному конструктору базового класса. Обратите внимание, что в этом случае нет открытого или защищенного конструктора базового класса без параметров, поэтому вам нужно использовать синтаксис "base" с параметрами.

licensed under cc by-sa 3.0 with attribution.