|
Введение в классы - Инициализаторы конструкторов (часть 9)
ИНИЦИАЛИЗАТОРЫ КОНСТРУКТОРОВ
Во всех конструкторах С#, кроме System.Object, конструкторы базового класса вызываются прямо перед исполнением первой строки конструктора. Эти инициализаторы конструкторов позволяют задавать класс и подлежащий вызову конструктор. Они бывают двух видов.
Инициализатор в виде base(...) активизирует конструктор базового класса текущего класса.
Инициализатор в виде this(...) позволяет текущему базовому классу вызвать другой конструктор, определенный в нем самом. Это полезно, когда вы перегрузили несколько конструкторов и хотите быть уверенными, что всегда будет вызван конструктор по умолчанию. О перегруженных методах разговор пойдет позже, здесь же мы приведем их краткое определение: перегруженными называются два и более метод с одинаковым именем, но с различными списками аргументов.
А теперь рассмотрим пример ситуации, когда выгодно использовать инициализаторы конструкторов. У нас опять два класса: А и В. На этот раз у класса А два конструктора, один из них не требует аргументов, а другой принимает аргумент типа int. У класса В один конструктор, принимающий аргумент типа int. При создании класса В возникает проблема. Если запустить следующий код, будет вызван конструктор класса А, не принимающий аргументов:
using System;
class A
{
public A()
{
Console.WriteLine("A");
}
public A(int foo)
{
Console.WriteLine("A = {0}", foo);
}
}
class В: A
{
public B(int foo)
{
Console.WriteLine("В = {0}", foo);
}
}
class DerivedlnitializerlApp
{
public static void Main()
{
В b = new В();
...
}
}
|
Как же гарантировать, что будет вызван именно нужный конструктор класса А? Явно указав компилятору, какой конструктор в инициализаторе должен быть вызван первым, скажем, так:
using System;
class A
{
public A()
{
Console.WriteLine("A");
}
public A(int foo)
{
Console.WriteLine("A = {0}", foo);
}
}
class В: А
{
public B(int foo); base (foo)
{
Console.WriteLine("B = {0}", foo);
}
}
class DerivedInitializerApp
{
public static void Main()
{
B b = new В(42);
}
}
|
Предыдущая стр.   
Оглавление   
Следующая стр.
Средняя оценка:     (2 - 4 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
Комментирует Volosatik.91 19.03.2011 20:29:12 не работают примеры. В первом ругаются что не найден конструктор, а во втором пишет что base недопустимая лексема в объявлении класса. Не понятно почему так?
Комментирует Walker 03.09.2011 0:09:04 public B(int foo): base (foo)
{
Console.WriteLine("B = {0}", foo);
}
А разве не так правильно объявлять? через двоеточие...
|
|