Наследование. Множественное наследование. Интерфейсы

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

Класс потомок наследует все возможности родительского класса – все поля и все методы, открытую и закрытую часть класса, статическую и динамическую части класса. Потомок может не иметь прямого доступа ко всем наследуемым полям и методам. Поля и методы родительского класса, снабженные атрибутом private, хотя и наследуются, но являются закрытыми, и методы, создаваемые потомком, не могут к ним обращаться напрямую, а только через методы, наследованные от родителя. Хорошей стратегией при проектировании класса является использование модификатора доступа protected вместо модификатора private, разрешая потомкам класса прямой доступ ко всем полям и методам родительского класса.

Потомок наследует почти все, но не все. Он не наследует конструкторы родительского класса. Конструкторы потомок должен создавать сам.

Потомок класса, наследовав от родительского класса какой-либо метод, может его переопределить, задав собственную реализацию, отличную от реализации, которая используется родителем. Переопределяемый метод родителя должен снабжаться модификатором override.

Интерфейсы – это еще один инструмент реализации полиморфизма в С#. Интерфейс представляет собой набор методов (свойств, событий, индексаторов), реализацию которых должен обеспечить класс, который реализует интерфейс.

Интерфейс может содержать только сигнатуры (имя и типы параметров) своих членов. Интерфейс не может содержать конструкторы, поля, константы, статические члены. Создавать объекты интерфейса невозможно.

Объявление интерфейса: интерфейс – это единица уровня класса, он объявляется за пределами класса, при помощи ключевого слова interface:

interface ISomeInterface
{
// тело интерфейса
}

Множественное наследование – это когда один класс сразу наследуется от нескольких классов. Но бывает так, что базовые классы содержат методы с одинаковыми именами, в результате чего возникают определенные неточности и ошибки. Множественное наследование есть в языке C++, а в C# от него отказались и внесли интерфейсы. В C# класс может реализовать сразу несколько интерфейсов. Это и является главным отличием использования интерфейсов и абстрактных классов. Кроме того, конечно же, абстрактные классы могут содержать все остальные члены, которых не может быть в интерфейсе, и не все методы/свойства в абстрактном классе должны быть абстрактными.

Перечисления. Шкалы

Перечисление

Частный случай класса, класс, заданный без собственных методов. Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. Поскольку у перечислений нет собственных методов, то синтаксис объявления этого класса упрощается, остается обычный заголовок и тело класса, содержащее список возможных значений. Вот формальное определение синтаксиса перечислений:

[атрибуты][модификаторы]enum имя_перечисления[:базовый класс]

{список_возможных_значений}

Модификаторами могут быть четыре известных модификатора доступа и модификатор new. Ключевое слов enum (сокращение слова enumeration ) говорит, что определяется частный случай класса - перечисление. Список возможных значений задает те значения, которые могут получать объекты этого класса. Возможные значения должны быть идентификаторами. Как и всюду в C#, при построении идентификаторов допускаются не только символы латиницы, но и символы кириллицы. Для имен переменных и других программных сущностей принято использовать латиницу, для элементов перечисления использование слов русского языка является нормой. Идентификаторы являются константами, называемыми перечислителями ( enumerator ), а само перечисление можно рассматривать как список перечислителей.

Приведу примеры объявлений классов-перечислений:

public enum Profession{teacher, engineer, businessman};public enum MyColors {red, blue, yellow, black, white};public enum TwoColors {black, white};public enum Rainbow {красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый};public enum Sex: byte {man=1, woman};public enum Days:long {Sun,Mon,Tue,Wed,Thu, Fri, Sat};

Шкалы

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

Каждый объект перечисления, заданного шкалой, представляется целым числом в диапазоне [0, 2n -1]. Это число следует рассматривать как число в двоичной системе счисления - набор из n битов (разрядов), каждый из которых описывает соответствующее свойство объекта. Единица в разряде указывает, что объект обладает данным свойством; ноль означает отсутствие свойства. Для объектов рассматриваемого нами класса Person можно ввести в рассмотрение набор из трех свойств - доброта, ум, богатство. Определим соответствующее перечисление как шкалу

public enum Dream_Properties { умный = 1, добрый = 2, богатый = 4 }

Добавим в класс Person соответствующее поле и метод-свойство для доступа к нему:

Dream_Properties properties;public Dream_Properties Properties{ get { return properties; } set { properties = value; }}

Наши рекомендации