double arrow

Типы наследования

Понятие наследования в программировании

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

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

Класс-потомок наследует все возможности родительского класса, то есть все поля и все методы, открытую и закрытую часть класса. Однако, не ко всем полям и методам класса возможен прямой доступ потомка. Например, поля и методы родительского класса, снабженные атрибутом private, хотя и наследуются, но по-прежнему остаются закрытыми, и методы, создаваемые потомком, не могут к ним обращаться к ним напрямую, а только через открытые или защищенные методы, унаследованные от родителя. Единственное чего не наследует потомок, так это конструкторы родительского класса. Потомок должен создавать конструкторы сам.

В ООП существуют два различных типа наследования: наследование реализации и наследование интерфейса

Наследование реализации означает, что новый тип порождается от базового класса, получая в свое распоряжение все его поля данных и функции. Такой тип наследования наиболее полезен, когда нужно добавить функциональность существующему типу, или же когда несколько связанных типов разделяют существенный объем общей функциональности.

Наследование интерфейса означает, что тип наследует только сигнатуру (прототип) функций, но не наследует никакой реализации. Этот тип обеспечивает доступ к определенным средствам. Например, для некоторых типов может быть указано, что они представляют метод визуализации объектов, называемый Draw(), за счет того, что наследуют интерфейс IDisplay. Поскольку способ, которым один тип вырисовывает самого себя, скорее всего, будет значительно отличаться от способа вырисовывания, используемого другим типом, то нет смысла определять никакой общей реализации, а потому в данном случае подходит наследование интерфейса. Наследование интерфейса часто интерпретируется как выполнение контракта: наследуя интерфейс, тип берет на себя обязанность представить своим клиентам определенную функциональность.

С# поддерживает как наследование реализации, так и наследование интерфейса. Здесь нет никаких предпочтений и оба типа наследования полностью встроены в язык с самого начала. Это облегчает выбор лучшей архитектуры для ваших решений.

Существует две формы наследования: простое и множественное. Для классов С# не поддерживает множественного наследования потому, что преимущества такого типа наследования достаточно спорны. Однако язык С# позволяет типу наследовать множество интерфейсов. Это означает, что класс может наследоваться от другого класса и любого количества интерфейсов.


Сейчас читают про: