Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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