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

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

Синтаксис одиночного наследования

Пусть имеется простой класс с именем Base. Выведем из него другой класс с именем Derived, в который будет встроен код класса Base. Код программы будет таким

using System;
    
namespace Test
{
    class Base
    {
        public string fieldBase = "Поле в Base";
    
        public string PropertiesBase
        {
            get { return "Свойство в Base"; }
            set { fieldBase = value; }
        }
    
        public void MethodBase()
        {
            Console.WriteLine("Метод в Base");
        }
    }
    
    class Derived : Base
    {
        public string fieldDerived = "Поле в Derived";
    
        public string PropertiesDerived
        {
            get { return "Свойство в Derived"; }
            set { fieldDerived = value; }
        }
    
        public void MethodDerived()
        {
            Console.WriteLine("Метод в Derived");
        }
    }
    
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Наследование классов";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 60;
            Console.WindowHeight = 10;
    
            // Создаем объект класса Derived
            Derived derived = new Derived();
    
            // Используем члены унаследованного класса Base
            Console.WriteLine("Унаследованная часть 
    класса Derived");
            Console.WriteLine(derived.fieldBase);
            Console.WriteLine(derived.PropertiesBase);
            derived.MethodBase();
            Console.WriteLine();
    
            // Используем члены расширения
            Console.WriteLine("Собственное 
    расширение класса Derived");
            Console.WriteLine(derived.fieldDerived);
            Console.WriteLine(derived.PropertiesDerived);
            derived.MethodDerived();
    
            Console.ReadLine();
        }
    }
}
Листинг 9.3 . Иллюстрация механизма наследования

Здесь для удобства все классы помещены в один файл с именем Program.cs. Результат выполнения выглядит так


Класс, который наследуется, называется базовым, а класс, который является наследником, называется производным или расширением базового класса. Говорят, что производный класс выведен из базового, а базовый класс наследует производному. Также говорят, что производный класс является потомком базового класса, а базовый класс его предком. Любой класс, участвующий в многоуровневой цепочке наследования, не может быть потомком самого себя, т.е не может участвовать более чем один раз.

Базовый и производный классы составляют цепочку наследования и создают иерархию классов. Оболочка Visual Studio 2005 имеет встроенные средства графического представления иерархии классов, которые вызываются в панели Solution Explorer командой View Class Diagram контекстного для файла меню или одноименной кнопкой этой панели.


Графическое представление цепочки наследования для нашего примера выглядит так


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

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

Код производного класса по отношению к присоединенному базовому классу является внешним, хотя и родственным. Поэтому внутренние private -члены базового класса недоступны в коде производного, общедоступные public -члены доступны также, как и для любого неродственного кода, а защищенные protected -члены базового класса недоступны коду неродственного класса, но доступны в коде производного класса. Например

using System;
    
namespace Test
{
    // Базовый класс
    class Base
    {
        int a; // Внутренний член базового класса
        protected int b; // Защищенный член базового класса
        public int c; // Общедоступный член базового класса
    
        public Base() // Общедоступный конструктор
        {
            a = 1; b = 2; c = 3;
        }
    
        // Недоступен внешнему коду, но доступен наследнику
        // Сумма квадратов
        protected int SumOfSquares()
        {
            return a * a + b * b + c * c;
        }
    }
    
    // Производный класс
    class Derived : Base
    {
        public void Show()
        {
            Console.WriteLine("Сумма квадратов: {0}", 
    SumOfSquares());// Доступен наследнику
        }
    }
    
    // Вызывающий код
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Доступ к членам в наследовании";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 60;
            Console.WindowHeight = 10;
    
            Derived derived = new Derived();
            derived.Show();
    
            Base @base = new Base();    // Скрыли ключевое слово base
            // @base.SumOfSquares();    // Недоступен в этом внешнем коде
    
            Console.ReadLine();
        }
    }
}
Листинг 9.4 . Доступ к членам базового класса в коде наследника
Максим Филатов
Максим Филатов

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

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

 

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