Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 9:

Наследование в C#

Передача аргументов конструктору базового класса

Если конструктор базового класса имеет параметры, то их значения при наследовании нужно ему передать через конструктор производного класса по следующему синтаксису

конструктор_производного_класса(список_параметров) : base(список_аргументов){тело_конструктора_производного_класса}

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

using System;
    
namespace Test
{
    // Базовый класс
    class Base
    {
        // Все поля закрытые
        private int a, b, c; 
    
        public Base() // Конструктор по умолчанию
        {
            a = 1; b = 2; c = 3;
        }
    
        public Base(int a, int b, int c) // Конструктор с параметрами
        {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    
        // Недоступен внешнему коду, но доступен наследнику
        protected int SumOfSquares()
        {
            return a * a + b * b + c * c;
        }
    }
    
    // Производный класс
    class Derived : Base
    {
        // Собственное поле производного класса
        int d;
    
        // Конструктор по умолчанию
        public Derived()    
        {
            d = 4;
        }
    
        // Конструктор с параметрами
        public Derived(int a, int b, int c, int d)
            : base(a, b, c) // Передача значений базовому классу
        {
            this.d = d;
        }
    
        public void Show()
        {
            // Часть работы выполняет код базового класса
            Console.WriteLine("Сумма квадратов: {0}", 
    SumOfSquares() + d * d);
        }
    }
    
    // Вызывающий код
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Доступ к членам в наследовании";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 60;
            Console.WindowHeight = 10;
    
            Derived derived = new Derived(5, 6, 7, 8);
            derived.Show(); 
            Console.WriteLine("Контрольная сумма квадратов: 
    {0}", 25 + 36 + 49 + 64);
    
            Console.ReadLine();
        }
    }
}
Листинг 9.5 . Передача аргументов конструктору базового класса

Ключевое слово base со списком аргументов в объявлении конструктора производного класса фактически означает вызов конструктора базового класса с подходящей сигнатурой.

Если конструируется многоуровневая цепочка наследования классов, то последний потомок через свой конструктор должен обеспечить информацией всех своих предков. Например

using System;
    
namespace Test
{
    class A
    {
        int a; // Закрытое поле
    
        public A() // Конструктор по умолчанию
        {
            a = 1;
        }
    
        public A(int a) // Конструктор с параметрами
        {
            this.a = a;
        }
    
        protected int GetA()
        {
            return a;
        }
    }
    
    class B : A
    {
        int b; // Закрытое поле
    
        public B()
        {
            b = 2;
        }
    
        public B(int a, int b)
            : base(a)
        {
            this.b = b;
        }
    
        protected int GetB()
        {
            return b;
        }
    }
    
    class C : B
    {
        int c; // Закрытое поле
    
        public C()
        {
            c = 3;
        }
    
        public C(int a, int b, int c)
            : base(a, b)
        {
            this.c = c;
        }
    
        protected int GetC()
        {
            return c;
        }
    
        public void Show()
        {
            // Доступны все защищенные члены предков
            int sumOfSquares =
                GetA() * GetA() + GetB() * GetB() + GetC() * GetC();
            Console.WriteLine("Сумма квадратов: 
    {0}", sumOfSquares);
        }
    }
    
    // Вызывающий код
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Доступ к членам в наследовании";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 60;
            Console.WindowHeight = 10;
    
            C obC = new C(4, 5, 6);
            obC.Show();
            Console.WriteLine("Контрольная сумма 
    квадратов: {0}", 16 + 25 + 36);
    
            Console.ReadLine();
        }
    }
}
Листинг 9.6 . Иерархическая цепочка наследования

Диаграмма наследственных связей для этого примера будет такой


То, что мы рассмотрели, можно проиллюстрировать рисунком, на котором клиент передает данные инициализации через конструктор производного класса конструкторам базовых классов


Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?