SEALED классы в C#

Запрет наследования

В этой статье, я хочу сказать пару слов о явном запрете наследования. Точнее о том, как можно запретить использование написанного Вами класса, в качестве базового для других. Я постараюсь доступно и коротко обосновать зачем, и вообще это нужно ли это делать. Материал этой статьи так или иначе связан с темой наследования классов, так что, если Вы еще не знакомы с механизмом наследования, то можете не читать эту статью, а перейти к изучению основ. Вот Вам ссылка на урок, посвященный наследованию классов в C#. А для тех кто уже в теме, я продолжу повествование…

И так, продолжим! Сначала я расскажу, зачем вообще запрещать использование наших классов в качестве базовых. На самом деле, всё просто, если мы изначально не разрабатываем наш класс для использования в качестве базового, то это уже повод запретить наследовать другие классы от него! Почему, да хотя бы по тому, что не подготовленный для «отцовства» класс, хорошим «отцом» скорее всего не станет!

Давайте вспомним, для чего обычно программисты используют механизм наследования ? Ну, в первую очередь, приходит в голову мысль о повторном использовании уже написанного кода. Т.е. мы имеем некий класс, но хотим расширит его функциональность. Однако, создавать еще один класс, повторно реализую функциональность первого и дополняя его новшествами мы не ходим (особенно, если не мы авторы первого класса и даже не знаем как реализована его функциональность), вместо этого мы просто «получаем по наследству» эту самую функциональность и всего лишь, дополняем её. Да, для этого можно использовать наследование, но совсем не обязательно! Можно решить эту задачу более гибким, и дешевым способом (пока поверьте на слово, потом, я напишу отдельную статью про то, как это сделать).

Ну и вторая цель использования наследования — это установка определенных отношений между базовым классом, и классом наследником. Объекты производных классов система может воспринимать и как объекты базового. Если объяснять на пальцах, то тигр является не только тигром, но еще и животным (но не каждое животное является тигром). Эти отношения между классами, выходят на сцену при использования так называемого принципа подстановки. Другими словами, при работе с объектами производных классом, через ссылку базового типа. Но эффективное применение упомянутого выше принципа будет невозможно, если автор базового класса не предусмотрел возможность использования своего детища в качестве базового для других классов. Например, не сделал какой-то метод класса виртуальным. Вот что я имел ввиду, когда говорил про неподготовленные для «отцовства» классы.

Если Вы не совсем понимаете о чем я сейчас говорил, изучите следующий урок.

Так вот, если Вы сами пишете весь код, то Вы просто можете договориться с собой, и не использовать какие-то классы в качестве базовых для других. Но в реальной практике, Вы, как разработчик потенциально базового класса можете быть даже не знакомы с программистом, решившим использовать Ваше творение в качестве базы для своего! И это может привести к неприятным сюрпризам для того человека. Но в C# есть возможность запретить использование класса в качестве родительского на этапе его разработки. И делается это очень просто, нужно добавить перед ключевым словом class ключевое слово sealed.

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

//"Отцом" уже не будет!
sealed class SomeClass
{
    //Тело класса
}

В следующей статье, я, пожалуй, расскажу о том, как можно заменить наследование, если нам нужно просто повторное использование функциональности.

Добавить комментарий