louis vuitton bag moncler jacka ugg boots mbt sko louis vuitton oslo moncler ugg www.steklo1.ru
   Поиск
 

Изучаем C Sharp (C#)

Программирование на C Sharp (C#) с нуля

Cи Шарп это просто Simple C#
Логин Пароль Вход Регистрация
Главная
Изучаем C#
Web-приложения
Win-приложения
Web-сервисы
ADO.NET
FrameWork
Алгоритмы
Исходники
Классы
Среда разработки
Статьи
Форум
FAQ
О Проекте
Обратная связь
Отблагодарить
Rambler's Top100

Введение в классы - Инициализаторы конструкторов (часть 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); } А разве не так правильно объявлять? через двоеточие...



Практический обучающий видео-курс "Основы C#"

От профессионального
разработчика для начинающих
и опытных программистов!

Кликните, чтобы изучить
язык C# с нуля и научиться
писать программы под платформу .NET!