Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 9:

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

Вот простой пример, когда объявление любого класса абстрактным запрещает его реализацию в объекты

using System;
    
namespace Test
{
    // Хоть нет абстрактных методов 
    // и класс готов к производству объектов,
    // захотели объявить абстрактным
    abstract class A
    {
        string name = "Класс A";
        public virtual void Show()
        {
            Console.WriteLine(name);
        }
    }
    
    // Может производить объекты,
    // хоть и наследует абстрактный класс
    class B : A
    {
        string name = "Класс B";
        public override void Show()
        {
            Console.WriteLine(name);
        }
    }
    
    // Может производить объекты
    class C
    {
        string name = "Класс C";
        public void Show()
        {
            Console.WriteLine(name);
        }
    }
    
    // Нет виртуальных функций и ничего не наследует, 
    // все равно можно запретить производить объекты
    abstract class D
    {
        string name = "Класс D";
        public void Show()
        {
            Console.WriteLine(name);
        }
    }
    
    // Вызывающая сторона
    class MyClass
    {
        public MyClass()
        {
            // Создаем и распечатываем объекты
            // A a = new A();  a.Show();    // Ошибка компиляции!!!
            B b = new B();  b.Show();
            A b1 = new B(); b1.Show();// Тонкая ссылка - толстый объект
            C c = new C();  c.Show();
            // D d = new D(); d.Show();     // Ошибка компиляции!!!
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Производить объекты 
    абстрактных классов запрещено";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 60;
            Console.WindowHeight = 10;
    
            new MyClass();// Чтобы сработал конструктор
    
            Console.ReadLine();
        }
    }
}
Листинг 9.19 . Объявление класса абстрактным запрещает его реализацию

Вот результат после закомментирования выделенных строк


Запрещение классу участвовать в наследовании

Иногда разработанный класс может оказаться настолько совершенным и самодостаточным, что не предполагает никаких дальнейших усовершенствований путем новых расширений. В этом случае его можно объявить с модификатором sealed и компилятор будет пресекать все попытки использовать его в качестве базового для дальнейших расширений. При этом будет безразлично, включен ли такой класс в текущий проект в исходном виде, или существует в откомпилированном виде в подключенной к проекту библиотечной сборке.

Вот пример

using System;
    
namespace Test
{
    // Не может иметь наследников
    sealed class A
    {
    }
    
    /* Чтобы быстро отменить комментарий, поставьте спереди слеш /
    // Ошибка компиляции здесь!!! Запрещено наследоваться
    class B : A
    {
    }
    //*/
    
    // Может наследоваться
    class C
    {
    }
    
    // Может наследоваться
    class D : C
    {
    }
    
    // Вызывающая сторона
    class MyClass
    {
        public MyClass()
        {
            // Просто создаем объекты в управляемой куче
            A a = new A();  // Создавать объекты можно, 
                            // а наследоваться нельзя
            //B b = new B();// Нет такого класса, он закомментирован
            C c = new C();
            D d = new D();
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Запрет классу иметь наследников";
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 60;
            Console.WindowHeight = 10;
    
            new MyClass();// Чтобы сработал конструктор
    
            Console.ReadLine();
        }
    }
}
Листинг 9.20 . Запрет классу иметь наследников
Максим Филатов
Максим Филатов

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

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974