Зачем называть базовый конструктор? - PullRequest
0 голосов
/ 04 апреля 2011

Имея такой код:

class A
{
  public A(int x)
  {}
}
class B:A
{
  public B(int x):base(3)
  {}
}

Я не понимаю. Класс B является независимым потомком класса A, почему мне нужно вызвать его конструктор? Я запутался, так как похоже, что экземпляр A создается при создании экземпляра B ..

Ответы [ 8 ]

4 голосов
/ 04 апреля 2011

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

class A
{
  private int foo;
  public int Foo { get { return foo; } }
  public A(int x)
  {
      foo = x;
      OpenConnectionOrSomething();
  }
}
class B:A
{
  public B(int x) : base(x)
  {
      // can't initialize foo here: it's private
      // only the base class knows how to do that
  }

  // this property uses the Foo property initialized in the base class 
  public int TripleOfFoo { get { return 3*Foo; } }
}
3 голосов
/ 04 апреля 2011

Класс B является не независимым от класса A: он наследует класс A и, таким образом, является "расширением" этого класса.

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

1 голос
/ 04 апреля 2011

Reason is based class определяет, что для его конструктора требуется параметр.Вы наследуете, поэтому вам придется соблюдать требования A.

1 голос
/ 04 апреля 2011

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

1 голос
/ 04 апреля 2011

В классе A нет конструктора без параметров, поэтому вы должны вызывать A (int x) из конструктора B.

1 голос
/ 04 апреля 2011

Если вы не вызываете базовый конструктор, как A должен знать, что int x в B - это то же int x, что и в A?

0 голосов
/ 04 апреля 2011

Когда вы создаете экземпляр производного класса, вы всегда должны вызывать базовый конструктор, и нет пути его обойти. Однако, если базовый класс имеет конструктор без параметров, вам не нужно указывать вызов базового конструктора, если вы его опустите, он неявно вызовет конструктор без параметров. Если базовый класс не имеет конструктора без параметров (как в вашем примере), вы должны указать, какой базовый конструктор вызывать и какие параметры отправлять ему.

Когда вы создаете экземпляр класса B, вы вроде создаете экземпляр класса A, потому что B экземпляр равен an A экземпляр. Конструктор в базовом классе должен быть вызван для инициализации любых членов, которые вы можете унаследовать. Сначала объект инициализируется как экземпляр A, а затем как экземпляр B.

0 голосов
/ 04 апреля 2011

Экземпляр A создается при создании B, поскольку B наследует экземпляр A

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...