Как запретить наследование класса в C#
![]()
Для предотвращения наследования от класса необходимо объявить его с модификатором sealed. Например, если мы не хотим чтобы от класса SomeClass можно было наследоваться, то объявляем его так:
![]()
В качестве альтернативы, можно запретить и создание экземпляров этого класса с помощью ключевого слова static (под капотом, будет использована пара модификаторов: abstract sealed ).
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Developing.ru
Есть класс А, и мы можем создать объект класса А. Надо сделать так чтобы не создавалось объект типа производного от А.
А смысл? Что такого можно сделать через экземпляр наследника класса A, но нельзя сделать через экземпляр самогО класса A?
Если какое-то расширение функционала, то что помешает (даже если Вам удастся реализовать задуманное) кому-то создась свой совершенно произвольный класс (этакий «псевдонаследник» класса A), в котором будет объявлен член типа A? Разница в этих двух случаях (наследник от A и новый класс, имеющий член класса A) будет лишь в доступе у protected-членам класса A. Наследник будет иметь к ним доступ, а новый класс с членом типа A — нет.
Вообще, лучше бы описали изначальную задачу. А то, похоже, Вы придумали некий сбоеобразый способ ее решение, а теперь интересуетесь, как этот сбоеобразый способ осуществить. Скорее всего можно придумать менее экстравагантный способ решения изначальной задачи.
Нужно чтобы создавалось объект класса А, и не создавалось производного от А.
И по поводу смысла: не все задачи имеют смысл, просто для мышления. Вопрос мне дал мой друг а ему дали во время интервью.
Как запретить наследование от класса c

Запрет наследования
В этой статье, я хочу сказать пару слов о явном запрете наследования. Точнее о том, как можно запретить использование написанного Вами класса, в качестве базового для других. Я постараюсь доступно и коротко обосновать зачем, и вообще это нужно ли это делать. Материал этой статьи так или иначе связан с темой наследования классов, так что, если Вы еще не знакомы с механизмом наследования, то можете не читать эту статью, а перейти к изучению основ. Вот Вам ссылка на урок, посвященный наследованию классов в C#. А для тех кто уже в теме, я продолжу повествование…
И так, продолжим! Сначала я расскажу, зачем вообще запрещать использование наших классов в качестве базовых. На самом деле, всё просто, если мы изначально не разрабатываем наш класс для использования в качестве базового, то это уже повод запретить наследовать другие классы от него! Почему, да хотя бы по тому, что не подготовленный для «отцовства» класс, хорошим «отцом» скорее всего не станет!
Давайте вспомним, для чего обычно программисты используют механизм наследования ? Ну, в первую очередь, приходит в голову мысль о повторном использовании уже написанного кода. Т.е. мы имеем некий класс, но хотим расширит его функциональность. Однако, создавать еще один класс, повторно реализую функциональность первого и дополняя его новшествами мы не ходим (особенно, если не мы авторы первого класса и даже не знаем как реализована его функциональность), вместо этого мы просто «получаем по наследству» эту самую функциональность и всего лишь, дополняем её. Да, для этого можно использовать наследование, но совсем не обязательно! Можно решить эту задачу более гибким, и дешевым способом (пока поверьте на слово, потом, я напишу отдельную статью про то, как это сделать).
Ну и вторая цель использования наследования — это установка определенных отношений между базовым классом, и классом наследником. Объекты производных классов система может воспринимать и как объекты базового. Если объяснять на пальцах, то тигр является не только тигром, но еще и животным (но не каждое животное является тигром). Эти отношения между классами, выходят на сцену при использования так называемого принципа подстановки. Другими словами, при работе с объектами производных классом, через ссылку базового типа. Но эффективное применение упомянутого выше принципа будет невозможно, если автор базового класса не предусмотрел возможность использования своего детища в качестве базового для других классов. Например, не сделал какой-то метод класса виртуальным. Вот что я имел ввиду, когда говорил про неподготовленные для «отцовства» классы.
Если Вы не совсем понимаете о чем я сейчас говорил, изучите следующий урок.
Так вот, если Вы сами пишете весь код, то Вы просто можете договориться с собой, и не использовать какие-то классы в качестве базовых для других. Но в реальной практике, Вы, как разработчик потенциально базового класса можете быть даже не знакомы с программистом, решившим использовать Ваше творение в качестве базы для своего! И это может привести к неприятным сюрпризам для того человека. Но в C# есть возможность запретить использование класса в качестве родительского на этапе его разработки. И делается это очень просто, нужно добавить перед ключевым словом class ключевое слово sealed.
И всё, теперь теперь программист, не имеющий доступа к исходникам Вашего класса, не сможет использовать его как базовый для своих. А теперь покажу это на практике:
В следующей статье, я, пожалуй, расскажу о том, как можно заменить наследование, если нам нужно просто повторное использование функциональности.