Использование наследования в конструкторе (publix X (): y) - PullRequest
4 голосов
/ 18 июня 2010

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

public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm)
{
this.mainForm = mainForm;
splashTimer.Tick += new EventHandler(SplashTimeUp);
splashTimer.Interval = 2000;
splashTimer.Enabled = true;
}

Ответы [ 6 ]

7 голосов
/ 18 июня 2010

Он вызывает конструктор базового класса, передавая ему аргумент splashForm типа Form.

Вы также можете вызывать методы базового класса.Если вы, например, переопределили метод, поведение которого вы хотите немного изменить, вы сделаете свои изменения и вызовете метод базового класса с помощью base.TheMethod().Это будет выглядеть так:

public override void FireMissiles()
{
   PrimeMissiles();

   base.FireMissiles();
}

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

4 голосов
/ 18 июня 2010

Что это такое ...

Эта строка называется инициализатором конструктора .Это означает «вызвать конструктор базового класса с параметром splashForm, а затем запустить тело этого конструктора».

Когда инициализатор конструктора явно не указан для конструктора, предполагается, что вы хотите base(), без параметровКонструктор.

... возможно ли это с обычными методами?

Для обычных методов вы, конечно, можете вызывать методы базового класса (с base.SomeMethod(...)), ностиль "инициализатор" недоступен.

4 голосов
/ 18 июня 2010

Синтаксис, который вы перечислили, означает, что этот конструктор вызывает конструктор суперкласса с параметром splashForm перед продолжением остальной части конструкции этого объекта.Если конструктор суперкласса не указан, подразумевается конструктор без аргументов, т.е.

public SplashAppContext(Form mainForm, Form splashForm)
{ ... }

эквивалентно

public SplashAppContext(Form mainForm, Form splashForm) : base()
{ ... }
2 голосов
/ 18 июня 2010
: base(splashForm)

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

1 голос
/ 18 июня 2010

Это синтаксис для вызова конструктора непосредственного родительского класса.Это синтаксис C #, тогда как VB.NET требует, чтобы вы вызывали MyBase.New(splashForm) в качестве первой строки кода в вашем конструкторе.

Это выражается так, потому что родительский объект гарантированно будет полностью создан и инициализированк тому времени, когда ваш дочерний конструктор кода начинает выполняться.Из-за этого оба компилятора (VB.NET и C #) указывают, что вы не можете выполнять какой-либо собственный код до вызова родительского конструктора (если вы не укажете родительский конструктор и существует конструктор без параметров, он будет вызванавтоматически).

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

1 голос
/ 18 июня 2010

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

...