Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Например, предположим, что снова моделируется автомобиль. Может возникнуть необходимость выразить идею, что автомобиль "имеет" радиоприемник. Было бы нелогично пытаться наследовать класс

Car
(автомобиль) от класса
Radio
(радиоприемник) или наоборот (ведь
Car
не "является"
Radio
). Взамен есть два независимых класса, работающих совместно, где класс
Car
создает и открывает доступ к функциональности класса
Radio
:

class Radio

{

public void Power(bool turnOn)

{

Console.WriteLine("Radio on: {0}", turnOn);

}

}

class Car

{

// Car 'имеет' Radio.

private Radio myRadio = new Radio;

public void TurnOnRadio(bool onOff)

{

//
Делегировать вызов внутреннему объекту.

myRadio.Power(onOff);

}

}

Обратите внимание, что пользователю объекта ничего не известно об использовании классом

Car
внутреннего объекта
Radio
:

// Call is forwarded to Radio internally.

Car viper = new Car;

viper.TurnOnRadio(false);

Роль полиморфизма

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

Выражаясь кратко, виртуальный член — это член базового класса, определяющий стандартную реализацию, которую можно изменять (или более формально переопределять) в производном классе. В отличие от него абстрактный метод — это член базового класса, который не предоставляет стандартную реализацию, а предлагает только сигнатуру. Если класс унаследован от базового класса, в котором определен абстрактный метод, то такой метод должен быть переопределен в производном классе. В любом случае, когда производные классы переопределяют члены, определенные в базовом классе, по существу они переопределяют свою реакцию на тот же самый запрос.

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

Shape
определен виртуальный метод
Draw
, не принимающий параметров. С учетом того, что каждой фигуре необходимо визуализировать себя уникальным образом, подклассы вроде
Hexagon
и
Circle
могут переопределять метод
Draw
по своему
усмотрению (см. рис. 5.3).

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

Hexagon
и
Circle
унаследованы от общего родителя (
Shape
), массив элементов типа
Shape
может содержать любые объекты классов, производных от этого базового класса. Более того, поскольку класс
Shape
определяет полиморфный интерфейс для всех производных типов (метод
Draw
в данном примере), уместно предположить, что каждый член массива обладает такой функциональностью.

Рассмотрим следующий код, который заставляет массив элементов производных от

Shape
типов визуализировать себя с использованием метода
Draw
:

Shape[] myShapes = new Shape[3];

myShapes[0] = new Hexagon;

myShapes[1] = new Circle;

myShapes[2] = new Hexagon;

foreach (Shape s in myShapes)

{

// Использовать полиморфный интерфейс!

s.Draw;

}

Console.ReadLine;

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

Модификаторы доступа C# (обновление в версии 7.2)

При работе с инкапсуляцией вы должны всегда принимать во внимание то, какие аспекты типа являются видимыми различным частям приложения. В частности, типы (классы, интерфейсы, структуры, перечисления и делегаты), а также их члены (свойства, методы, конструкторы и поля) определяются с использованием специального ключевого слова, управляющего "видимостью" элемента для других частей приложения. Хотя в C# для управления доступом предусмотрены многочисленные ключевые слова, они отличаются в том, к чему могут успешно применяться (к типу или члену). Модификаторы доступа и особенности их использования описаны в табл. 5.1.

В текущей главе рассматриваются только ключевые слова

public
и
private
. В последующих главах будет исследована роль модификаторов
internal
и
protected internal
(удобных при построении библиотек кода и модульных тестов) и модификатора
protected
(полезного при создании иерархий классов).

Использование стандартных модификаторов доступа

Поделиться:
Популярные книги

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Камень Книга одиннадцатая

Минин Станислав
11. Камень
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Камень Книга одиннадцатая

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Сумеречный Стрелок 10

Карелин Сергей Витальевич
10. Сумеречный стрелок
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Сумеречный Стрелок 10