День сто двадцать второй. #ВопросыНаСобеседовании

Самые часто задаваемые вопросы на собеседовании по C#

11. Что такое закрытый класс в C#?

Закрытые классы используются для ограничения наследования в объектно-ориентированном программировании. Класс, определёный как закрытый, не может быть унаследован.

В C# для определения закрытого класса используется модификатор sealed. Если создать класс производный от закрытого класса, то компилятор выдаст ошибку.

Все структуры закрыты. Вы не можете унаследовать класс из структуры.



Закрытые методы и свойства

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

class X

{

protected virtual void F()

{

Console.WriteLine("X.F");

}

protected virtual void F2()

{

Console.WriteLine("X.F2");

}

}

class Y : X

{

sealed protected override void F()

{

Console.WriteLine("Y.F");

}

protected override void F2()

{

Console.WriteLine("Y.F2");

}

}

class Z : Y

{

// Попытка переопределить F приводит к ошибке компиляции CS0239.

protected override void F()

{

Console.WriteLine("C.F");

}

// Допустимо переопределить F2

protected override void F2()

{

Console.WriteLine("Z.F2");

}

}



Зачем использовать закрытые классы?

Основная цель закрытого класса состоит в том, чтобы запретить наследование от класса. Один из лучших вариантов использования закрытых классов - это класс со статическими членами. Например, классы Pens и Brushes в пространстве имен System.Drawing. Класс Pens представляет ручки со стандартными цветами. Этот класс имеет только статические члены. Например, Pens.Blue представляет собой ручку синего цвета. Аналогично, класс Brushes представляет стандартные кисти. Brushes.Red представляет собой кисть с красным цветом.

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

В библиотеке классов Microsoft наследование ограничено только теми местами, где оно действительно имеет смысл. Очень многие классы, например String, закрыты. Ключевое слово sealed сообщает CLR, что ниже по иерархии нет классов для поиска методов, что повышает производительность.



Источники:

-
https://www.c-sharpcorner.com

-
https://stackoverflow.com/questions/7777611/when-and-why-would-you-seal-a-class