2 added
2 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Основная терминология</a></li>
1
<ul><li><a>Основная терминология</a></li>
2
<li><a>О классах C++</a></li>
2
<li><a>О классах C++</a></li>
3
<li><a>Наследование Си Плюс-Плюс</a><ul><li><a>Класс "Человек"</a></li>
3
<li><a>Наследование Си Плюс-Плюс</a><ul><li><a>Класс "Человек"</a></li>
4
<li><a>Public Class "Игроки в баскетбол"</a></li>
4
<li><a>Public Class "Игроки в баскетбол"</a></li>
5
<li><a>Сделать "Баскетбольных игроков" дочерним</a></li>
5
<li><a>Сделать "Баскетбольных игроков" дочерним</a></li>
6
<li><a>Public элемент Employer</a></li>
6
<li><a>Public элемент Employer</a></li>
7
<li><a>Цепочки</a></li>
7
<li><a>Цепочки</a></li>
8
</ul></li>
8
</ul></li>
9
<li><a>"Заимствование" и C#</a><ul><li><a>Пример "Животные" и конструкторы</a></li>
9
<li><a>"Заимствование" и C#</a><ul><li><a>Пример "Животные" и конструкторы</a></li>
10
</ul></li>
10
</ul></li>
11
<li><a>Множественное наследование в C</a><ul><li><a>В С++</a><ul><li><a>Возможные неурядицы</a></li>
11
<li><a>Множественное наследование в C</a><ul><li><a>В С++</a><ul><li><a>Возможные неурядицы</a></li>
12
</ul></li>
12
</ul></li>
13
<li><a>В C#</a><ul><li><a>Об интерфейсах</a></li>
13
<li><a>В C#</a><ul><li><a>Об интерфейсах</a></li>
14
<li><a>О непосредственном "перенятии"</a></li>
14
<li><a>О непосредственном "перенятии"</a></li>
15
</ul></li>
15
</ul></li>
16
</ul></li>
16
</ul></li>
17
</ul><p>Каждый уважающий себя программист должен уметь работать с языками программирования, которые относятся к Си-семейству. Это - современный подход при написании разнообразного контента. В основном упор делается на C++. Профессиональные разработчики способны применять данную "лексику" как для элементарных, так и для крупных запутанных задач.</p>
17
</ul><p>Каждый уважающий себя программист должен уметь работать с языками программирования, которые относятся к Си-семейству. Это - современный подход при написании разнообразного контента. В основном упор делается на C++. Профессиональные разработчики способны применять данную "лексику" как для элементарных, так и для крупных запутанных задач.</p>
18
<p>Каждый язык имеет собственные нюансы, алгоритмы, объекты и функции. Немаловажным моментом является так называемое наследование. Зная, что это такое, можно с легкостью составить довольно сложный программный код с минимальными усилиями. В статье будут рассмотрены принципы наследования в C++ и C#.</p>
18
<p>Каждый язык имеет собственные нюансы, алгоритмы, объекты и функции. Немаловажным моментом является так называемое наследование. Зная, что это такое, можно с легкостью составить довольно сложный программный код с минимальными усилиями. В статье будут рассмотрены принципы наследования в C++ и C#.</p>
19
<h2>Основная терминология</h2>
19
<h2>Основная терминология</h2>
20
<p>Для того, чтобы хорошо разбираться в дальнейшей информации, пользователю предстоит изучить некоторые термины:</p>
20
<p>Для того, чтобы хорошо разбираться в дальнейшей информации, пользователю предстоит изучить некоторые термины:</p>
21
<ol><li>Базовый класс - некий класс, который выступает "базисом" при наследовании производным классом.</li>
21
<ol><li>Базовый класс - некий класс, который выступает "базисом" при наследовании производным классом.</li>
22
<li>Деструкторы - методы класса, необходимые для деинициализации объекта.</li>
22
<li>Деструкторы - методы класса, необходимые для деинициализации объекта.</li>
23
<li>Идентификатор - уникальное имя, присваиваемое функциям, переменным, иным объектам программирования.</li>
23
<li>Идентификатор - уникальное имя, присваиваемое функциям, переменным, иным объектам программирования.</li>
24
<li>Инкапсуляция - механизмы, связывающие коды (операции) с информацией, коими происходит манипуляция. Осуществляется дополнительная защита от внешнего вмешательства и неправильного задействования.</li>
24
<li>Инкапсуляция - механизмы, связывающие коды (операции) с информацией, коими происходит манипуляция. Осуществляется дополнительная защита от внешнего вмешательства и неправильного задействования.</li>
25
<li>Класс - шаблоны, определяющие тот или иной объект в программе, его форму.</li>
25
<li>Класс - шаблоны, определяющие тот или иной объект в программе, его форму.</li>
26
<li>Конструкторы - методы классов. Используются для инициализации элементов.</li>
26
<li>Конструкторы - методы классов. Используются для инициализации элементов.</li>
27
<li>Массивы - коллекции переменных одного и того же вида. К ним обращение происходит при помощи общих имен.</li>
27
<li>Массивы - коллекции переменных одного и того же вида. К ним обращение происходит при помощи общих имен.</li>
28
<li>Переменная - основная единица при составлении машинного кода. Элемент памяти, которому присвоили имя и значение.</li>
28
<li>Переменная - основная единица при составлении машинного кода. Элемент памяти, которому присвоили имя и значение.</li>
29
<li>Полиморфизм - свойство классов решать похожие задачи разными способами. Одно имя используется сразу для нескольких методов, обладающих похожими друг на друга назначениями.</li>
29
<li>Полиморфизм - свойство классов решать похожие задачи разными способами. Одно имя используется сразу для нескольких методов, обладающих похожими друг на друга назначениями.</li>
30
<li>Производный класс - своеобразный класс, наследующий от базового.</li>
30
<li>Производный класс - своеобразный класс, наследующий от базового.</li>
31
<li>Рекурсия - операция, при которой функция вызывает сама себя.</li>
31
<li>Рекурсия - операция, при которой функция вызывает сама себя.</li>
32
<li>Строка (String name) - последовательность символов (с именем), заключенная в двойные кавычки.</li>
32
<li>Строка (String name) - последовательность символов (с именем), заключенная в двойные кавычки.</li>
33
<li>Структура - образец, определяющий форму объекта. От класса отличается тем, что все его составляющие являются открытыми изначально.</li>
33
<li>Структура - образец, определяющий форму объекта. От класса отличается тем, что все его составляющие являются открытыми изначально.</li>
34
<li>Указатели - маркеры/объекты, хранящие в себе адреса памяти.</li>
34
<li>Указатели - маркеры/объекты, хранящие в себе адреса памяти.</li>
35
<li>Функции - подпрограмма или операция, которая используется при решении тех или иных задач.</li>
35
<li>Функции - подпрограмма или операция, которая используется при решении тех или иных задач.</li>
36
-
</ol><p>Все это обязательно поможет каждому программисту. Предложенная терминология используется не только в Си-семействе, но и в остальных programming languages.</p>
36
+
</ol><p>Все это обязательно поможет каждому программисту. Предложенна�� терминология используется не только в Си-семействе, но и в остальных programming languages.</p>
37
<h2>О классах C++</h2>
37
<h2>О классах C++</h2>
38
<p>Программист, который может написать утилиту на C++ - это настоящий профессионал. Но для того, чтобы справиться с поставленной задачей, приходится изучать разнообразные особенности "лексики".</p>
38
<p>Программист, который может написать утилиту на C++ - это настоящий профессионал. Но для того, чтобы справиться с поставленной задачей, приходится изучать разнообразные особенности "лексики".</p>
39
<p>Немаловажный раздел - это классы и объекты. Они тесно связаны с так называемым наследованием, на котором будет заострено внимание далее.</p>
39
<p>Немаловажный раздел - это классы и объекты. Они тесно связаны с так называемым наследованием, на котором будет заострено внимание далее.</p>
40
<p>Классом принято в C++ называть абстракции, которые описывают методы и свойства элементов, которых не существует. Объекты здесь - это конкретизированное представление абстракций со своими методами и свойствами.</p>
40
<p>Классом принято в C++ называть абстракции, которые описывают методы и свойства элементов, которых не существует. Объекты здесь - это конкретизированное представление абстракций со своими методами и свойствами.</p>
41
<p>Экземпляры класса - составляющие утилиты, которые появились, опираясь на один класс. У них может быть совершенно разное поведение и свойства. Построить оные удается несколькими способами. А именно:</p>
41
<p>Экземпляры класса - составляющие утилиты, которые появились, опираясь на один класс. У них может быть совершенно разное поведение и свойства. Построить оные удается несколькими способами. А именно:</p>
42
<ol><li>Инкапсуляцией. С ее помощью происходит объединение в классах данных и методов. Детализация скрывается от юзера.</li>
42
<ol><li>Инкапсуляцией. С ее помощью происходит объединение в классах данных и методов. Детализация скрывается от юзера.</li>
43
<li>Полиморфизмом. Свойство, посредством которого объекты классов с одними и теми же интерфейсами без сведений о типе и внутренней структуре могут задействоваться при необходимости.</li>
43
<li>Полиморфизмом. Свойство, посредством которого объекты классов с одними и теми же интерфейсами без сведений о типе и внутренней структуре могут задействоваться при необходимости.</li>
44
<li>Наследованием. Процесс, который позволяет создавать классы-потомки. За основу берется уже существующий вариант, а характеристики "родителя" присваиваются "следующему поколению".</li>
44
<li>Наследованием. Процесс, который позволяет создавать классы-потомки. За основу берется уже существующий вариант, а характеристики "родителя" присваиваются "следующему поколению".</li>
45
</ol><p>Для того, чтобы класс объявить, требуется задействовать ключевое слово Class. У рассматриваемого элемента есть спецификаторы доступа:</p>
45
</ol><p>Для того, чтобы класс объявить, требуется задействовать ключевое слово Class. У рассматриваемого элемента есть спецификаторы доступа:</p>
46
<ol><li>Private - методы и свойства, которые объявлены внутри class, будут доступны только в пределах оного.</li>
46
<ol><li>Private - методы и свойства, которые объявлены внутри class, будут доступны только в пределах оного.</li>
47
<li>Public - доступ предоставляется иным составляющим и функциям приложения.</li>
47
<li>Public - доступ предоставляется иным составляющим и функциям приложения.</li>
48
<li>Protected - предоставляет доступ к членам класса, а также к дружественным и дочерним "составляющим". За пределами тела class доступ закрывается.</li>
48
<li>Protected - предоставляет доступ к членам класса, а также к дружественным и дочерним "составляющим". За пределами тела class доступ закрывается.</li>
49
</ol><p>Это базис, который пригодится каждому для углубленного изучения наследования.</p>
49
</ol><p>Это базис, который пригодится каждому для углубленного изучения наследования.</p>
50
<h2>Наследование Си Плюс-Плюс</h2>
50
<h2>Наследование Си Плюс-Плюс</h2>
51
<p>В Си Плюс-Плюс наследование производится между классами. Тип отношений - "является". Class, от которого осуществляется рассматриваемая "операция", называется базовым (суперклассом или родительским). Тот элемент, который "забирает" свойства и характеристики - дочерним (подклассом или производным).</p>
51
<p>В Си Плюс-Плюс наследование производится между классами. Тип отношений - "является". Class, от которого осуществляется рассматриваемая "операция", называется базовым (суперклассом или родительским). Тот элемент, который "забирает" свойства и характеристики - дочерним (подклассом или производным).</p>
52
<p>Последний наследует методы и свойства (переменные). Дополнительно учитываются определенные ограничения доступа. Дочерние "составляющие" полноценны, могут обладать собственными членами. Далее будут рассматриваться примеры, помогающие разобраться в конструкторах базового класса, а также в наследовании в полной мере.</p>
52
<p>Последний наследует методы и свойства (переменные). Дополнительно учитываются определенные ограничения доступа. Дочерние "составляющие" полноценны, могут обладать собственными членами. Далее будут рассматриваться примеры, помогающие разобраться в конструкторах базового класса, а также в наследовании в полной мере.</p>
53
<h3>Класс "Человек"</h3>
53
<h3>Класс "Человек"</h3>
54
<p>Вот код, который поможет представить в приложении человека:</p>
54
<p>Вот код, который поможет представить в приложении человека:</p>
55
class Human { public: std::string m_name; int m_age; Human(std::string name = "", int age = 0) : m_name(name), m_age(age) { } std::string getName() const { return m_name; } int getAge() const { return m_age; } };<p>Здесь определяются только элементы, которые служат общими для всех объектов. Все люди, независимо от половой принадлежности, профессии, возраста и других "параметров", имеют возраст и имя.</p>
55
class Human { public: std::string m_name; int m_age; Human(std::string name = "", int age = 0) : m_name(name), m_age(age) { } std::string getName() const { return m_name; } int getAge() const { return m_age; } };<p>Здесь определяются только элементы, которые служат общими для всех объектов. Все люди, независимо от половой принадлежности, профессии, возраста и других "параметров", имеют возраст и имя.</p>
56
<p>Пример предусматривает спецификатор public. Отсюда следует, что имеющиеся переменные и методы открытые. Но можно сделать их "приватными", как это обычно бывает. Данный прием позволяет контролировать доступ и следить за наследованием.</p>
56
<p>Пример предусматривает спецификатор public. Отсюда следует, что имеющиеся переменные и методы открытые. Но можно сделать их "приватными", как это обычно бывает. Данный прием позволяет контролировать доступ и следить за наследованием.</p>
57
<p>Внимание: программерам в процессе работы с рассматриваемым действием может потребоваться работа с include iostream. Это - элемент стандартной библиотеки в Си Плюс-Плюс, который представлен заголовочным файлом с классами, переменными и функциями.</p>
57
<p>Внимание: программерам в процессе работы с рассматриваемым действием может потребоваться работа с include iostream. Это - элемент стандартной библиотеки в Си Плюс-Плюс, который представлен заголовочным файлом с классами, переменными и функциями.</p>
58
<h3>Public Class "Игроки в баскетбол"</h3>
58
<h3>Public Class "Игроки в баскетбол"</h3>
59
<p>На основании предложенного выше кода будем работать с наследованием в Си Плюс-Плюс. Требуется написать утилиту, отслеживающую сведения о тех, кто играет в баскетбол. Сохраняется средний уровень игры, а также то, сколько очков набрал конкретный человек:</p>
59
<p>На основании предложенного выше кода будем работать с наследованием в Си Плюс-Плюс. Требуется написать утилиту, отслеживающую сведения о тех, кто играет в баскетбол. Сохраняется средний уровень игры, а также то, сколько очков набрал конкретный человек:</p>
60
<p>Это - незавершенный public class. Дополнительно необходимо знать имя и возраст игрока. Для этого используется первый представленный код. Вывести запрашиваемую информацию предлагается несколькими способами:</p>
60
<p>Это - незавершенный public class. Дополнительно необходимо знать имя и возраст игрока. Для этого используется первый представленный код. Вывести запрашиваемую информацию предлагается несколькими способами:</p>
61
<ol><li>Добавить в "Баскетбольные игроки" новые члены с соответствующими материалами. Не самый лучший выход, так как он приводит к дублированию кода.</li>
61
<ol><li>Добавить в "Баскетбольные игроки" новые члены с соответствующими материалами. Не самый лучший выход, так как он приводит к дублированию кода.</li>
62
<li>При помощи так называемой композиции добавить public Human в виде члена класса BasketballPlayer. Но это некорректное решение.</li>
62
<li>При помощи так называемой композиции добавить public Human в виде члена класса BasketballPlayer. Но это некорректное решение.</li>
63
<li>Произвести настройку кода так, чтобы новый "элемент кода" наследовал те или иные атрибуты от первого. Это и есть тип отношений "является".</li>
63
<li>Произвести настройку кода так, чтобы новый "элемент кода" наследовал те или иные атрибуты от первого. Это и есть тип отношений "является".</li>
64
</ol><p>После изучения возможных вариантов развития событий стоит отдать предпочтение последнему.</p>
64
</ol><p>После изучения возможных вариантов развития событий стоит отдать предпочтение последнему.</p>
65
<h3>Сделать "Баскетбольных игроков" дочерним</h3>
65
<h3>Сделать "Баскетбольных игроков" дочерним</h3>
66
<p>Для реализации поставленной задачи требуется после public class BasketballPlayer воспользоваться двоеточием. Здесь без ключевого слова public не обойтись, как и без имени классового элемента. Это - открытая операция:</p>
66
<p>Для реализации поставленной задачи требуется после public class BasketballPlayer воспользоваться двоеточием. Здесь без ключевого слова public не обойтись, как и без имени классового элемента. Это - открытая операция:</p>
67
<p>Также программисты часто думают, что такое так называемое множественное наследование. Этот вопрос будет рассмотрен позже.</p>
67
<p>Также программисты часто думают, что такое так называемое множественное наследование. Этот вопрос будет рассмотрен позже.</p>
68
<p>Вследствие проделанных манипуляций происходит "заимствование" информации от родительских классов. У "Игроков в баскетбол" имеются и собственные члены - m_points и m_gameAverage. В них есть необходимость, так как на экран выводятся не только сведения об именах и возрасте.</p>
68
<p>Вследствие проделанных манипуляций происходит "заимствование" информации от родительских классов. У "Игроков в баскетбол" имеются и собственные члены - m_points и m_gameAverage. В них есть необходимость, так как на экран выводятся не только сведения об именах и возрасте.</p>
69
<p>Полный код утилиты будет выглядеть так:</p>
69
<p>Полный код утилиты будет выглядеть так:</p>
70
<p>В итоге на экране появится надпись "Антон" (на английском).</p>
70
<p>В итоге на экране появится надпись "Антон" (на английском).</p>
71
<h3>Public элемент Employer</h3>
71
<h3>Public элемент Employer</h3>
72
<p>Пусть будет еще один "потомок" от Human. За основу возьмем информацию о работниках. Подчиненный - это человек. Соответственно, изучаемый процесс здесь уместен:</p>
72
<p>Пусть будет еще один "потомок" от Human. За основу возьмем информацию о работниках. Подчиненный - это человек. Соответственно, изучаемый процесс здесь уместен:</p>
73
<p>Сразу прописывать public в самом начале кодификации не нужно. Это нарушает структуру кода. "Сотрудник" забирает от "Человека" два метода - имя и возраст, а также обладает собственными переменными и одним методом. PrintNameAndWage() задействует переменные как из родительского "источника", так и из собственного.</p>
73
<p>Сразу прописывать public в самом начале кодификации не нужно. Это нарушает структуру кода. "Сотрудник" забирает от "Человека" два метода - имя и возраст, а также обладает собственными переменными и одним методом. PrintNameAndWage() задействует переменные как из родительского "источника", так и из собственного.</p>
74
<p>Внимание: BasketballPlayer и Employer не связаны, но написаны в пределах одной и той же программы. Кодификация имеет следующий вид:</p>
74
<p>Внимание: BasketballPlayer и Employer не связаны, но написаны в пределах одной и той же программы. Кодификация имеет следующий вид:</p>
75
<p>В итоге на экране появится надпись "Иван: 350".</p>
75
<p>В итоге на экране появится надпись "Иван: 350".</p>
76
<h3>Цепочки</h3>
76
<h3>Цепочки</h3>
77
<p>Представляется возможным проводить передачу информации "потомкам" от классовых элементов, которые изначально тоже брали от "кого-то" данные. Можно для примера составить отдельный "блок" под названием Супервайзер:</p>
77
<p>Представляется возможным проводить передачу информации "потомкам" от классовых элементов, которые изначально тоже брали от "кого-то" данные. Можно для примера составить отдельный "блок" под названием Супервайзер:</p>
78
<p>Информация берется из public Employer, который когда-то получал сведения из Human.</p>
78
<p>Информация берется из public Employer, который когда-то получал сведения из Human.</p>
79
<h2>"Заимствование" и C#</h2>
79
<h2>"Заимствование" и C#</h2>
80
<p>Перед тем, как задумываться, что такое так называемое множественное наследование в Си-семействе, требуется разобраться с "обычным". Теперь рассмотрим несколько примеров C#.</p>
80
<p>Перед тем, как задумываться, что такое так называемое множественное наследование в Си-семействе, требуется разобраться с "обычным". Теперь рассмотрим несколько примеров C#.</p>
81
<p>Принципы использования здесь будут примерно такими же, как и в уже рассмотренном варианте. Для создания "дочерних" элементов не требуется никаких особых навыков и знаний. Для того, чтобы было проще работать с кодом, будем использовать тип public. Это поможет избежать появления дополнительных окон и сообщений об ошибке при получении доступа к запрашиваемым сведениям.</p>
81
<p>Принципы использования здесь будут примерно такими же, как и в уже рассмотренном варианте. Для создания "дочерних" элементов не требуется никаких особых навыков и знаний. Для того, чтобы было проще работать с кодом, будем использовать тип public. Это поможет избежать появления дополнительных окон и сообщений об ошибке при получении доступа к запрашиваемым сведениям.</p>
82
<p>Важно учитывать, что:</p>
82
<p>Важно учитывать, что:</p>
83
<ol><li>C# предусматривает одиночное "заимствование". От двух и более public (или иных) классовых составляющих процесс производиться не может.</li>
83
<ol><li>C# предусматривает одиночное "заимствование". От двух и более public (или иных) классовых составляющих процесс производиться не может.</li>
84
<li>Отношение наследования - некоторое отношение, демонстрирующее переход от общей абстракции к конкретной.</li>
84
<li>Отношение наследования - некоторое отношение, демонстрирующее переход от общей абстракции к конкретной.</li>
85
<li>Абстрактный классовых "объект" - классовая составляющая, объекты которого нельзя создавать. Ключевое слово new здесь не используется. Элемент задействуется в качестве прародителя.</li>
85
<li>Абстрактный классовых "объект" - классовая составляющая, объекты которого нельзя создавать. Ключевое слово new здесь не используется. Элемент задействуется в качестве прародителя.</li>
86
<li>Sealed - слово, которое позволяет устанавливать запрет на наследников. Пример - string. Права "заимствования" здесь не имеют места.</li>
86
<li>Sealed - слово, которое позволяет устанавливать запрет на наследников. Пример - string. Права "заимствования" здесь не имеют места.</li>
87
<li>Virtual - превращает метод в виртуальный, чтобы использовать предопределение наследников.</li>
87
<li>Virtual - превращает метод в виртуальный, чтобы использовать предопределение наследников.</li>
88
</ol><p>Все это поможет в дальнейших примерах. Пока рано задумываться, что такое часто применяемое множественное наследование, потому как не все разбираются в обычном. Ниже будет наглядный пример "манипуляции" в C#.</p>
88
</ol><p>Все это поможет в дальнейших примерах. Пока рано задумываться, что такое часто применяемое множественное наследование, потому как не все разбираются в обычном. Ниже будет наглядный пример "манипуляции" в C#.</p>
89
<h3>Пример "Животные" и конструкторы</h3>
89
<h3>Пример "Животные" и конструкторы</h3>
90
<p>Пусть будет классовый элемент Animal. В нем будут создаваться поля и методы, характерные для всей "живности":</p>
90
<p>Пусть будет классовый элемент Animal. В нем будут создаваться поля и методы, характерные для всей "живности":</p>
91
<ul><li>вес;</li>
91
<ul><li>вес;</li>
92
<li>сколько живет (в среднем);</li>
92
<li>сколько живет (в среднем);</li>
93
<li>наличие хвоста;</li>
93
<li>наличие хвоста;</li>
94
<li>что ест.</li>
94
<li>что ест.</li>
95
</ul><p>От него сделаем дочернюю классовую составляющую (тоже public) - "Собака". Исходный код:</p>
95
</ul><p>От него сделаем дочернюю классовую составляющую (тоже public) - "Собака". Исходный код:</p>
96
<p>Стоит обратить внимание на то, что "заимствованию" в Шарпе не подлежат так называемые конструкторы. Если они есть у родителей, то у наследников доступа к оным не будет. Несмотря на это, вызов будет осуществляться автоматически. Это - дефолтный конструктор. Чтобы его вызвать, рекомендуется использовать ключевик base.</p>
96
<p>Стоит обратить внимание на то, что "заимствованию" в Шарпе не подлежат так называемые конструкторы. Если они есть у родителей, то у наследников доступа к оным не будет. Несмотря на это, вызов будет осуществляться автоматически. Это - дефолтный конструктор. Чтобы его вызвать, рекомендуется использовать ключевик base.</p>
97
<p>Пусть будет некая классовая составляющая Degree, в котором выставлены градусы, а также метод, возвращающий его значение. Дочерним создадим Radiance. Он будет переводить информацию в радианы:</p>
97
<p>Пусть будет некая классовая составляющая Degree, в котором выставлены градусы, а также метод, возвращающий его значение. Дочерним создадим Radiance. Он будет переводить информацию в радианы:</p>
98
<p>Внимание: запись public virtual делает информацию виртуальной.</p>
98
<p>Внимание: запись public virtual делает информацию виртуальной.</p>
99
<h2>Множественное наследование в C</h2>
99
<h2>Множественное наследование в C</h2>
100
<p>До сих пор рассматривалось лишь "заимствование", которое предусматривало одиночный вариант. Дочерний классовый элемент в таком случае предусматривает только одного родителя (для удобства используется тип public). Но Си-семейство предусматривает и множественный "подход".</p>
100
<p>До сих пор рассматривалось лишь "заимствование", которое предусматривало одиночный вариант. Дочерний классовый элемент в таком случае предусматривает только одного родителя (для удобства используется тип public). Но Си-семейство предусматривает и множественный "подход".</p>
101
<h3>В С++</h3>
101
<h3>В С++</h3>
102
<p>Множественный "метод" - это когда у дочернего классового "объекта" будет несколько предков. Пример - отслеживание работы преподавателей. Работать будем с предыдущими элементами кода. Учитель - это человек, но также он будет подчиненным.</p>
102
<p>Множественный "метод" - это когда у дочернего классового "объекта" будет несколько предков. Пример - отслеживание работы преподавателей. Работать будем с предыдущими элементами кода. Учитель - это человек, но также он будет подчиненным.</p>
103
<p>Задумываясь, что такое в Си-семействе множественное наследование, стоит обращать внимание на логические связи. Без них освоить рассматриваемое направление невозможно. Поэтому создадим новый классовый "объект" под названием "Учитель".</p>
103
<p>Задумываясь, что такое в Си-семействе множественное наследование, стоит обращать внимание на логические связи. Без них освоить рассматриваемое направление невозможно. Поэтому создадим новый классовый "объект" под названием "Учитель".</p>
104
<p>Чтобы реализовать подход, потребуется:</p>
104
<p>Чтобы реализовать подход, потребуется:</p>
105
<ul><li>присвоить переменным (int main или другим) для удобства "тип" public;</li>
105
<ul><li>присвоить переменным (int main или другим) для удобства "тип" public;</li>
106
<li>прописать "стандартную" запись "заимствования";</li>
106
<li>прописать "стандартную" запись "заимствования";</li>
107
<li>через запятую указать тип "заимствования", а также второго родителя.</li>
107
<li>через запятую указать тип "заимствования", а также второго родителя.</li>
108
</ul><p>В конечном итоге получится такой код:</p>
108
</ul><p>В конечном итоге получится такой код:</p>
109
<p>В предложенном примере используется "заимствование" типа public.</p>
109
<p>В предложенном примере используется "заимствование" типа public.</p>
110
<h4>Возможные неурядицы</h4>
110
<h4>Возможные неурядицы</h4>
111
-
<p>Несмотря на т��, что рассмотренный прием - это довольно быстрое и простое расширение "базисного", его применение на практике способно привести в определенным ошибкам. Сложность утилит увеличивается. Поддержка кода способна стать настоящей проблемой.</p>
111
+
<p>Несмотря на то, что рассмотренный прием - это довольно быстрое и простое расширение "базисного", его применение на практике способно привести в определенным ошибкам. Сложность утилит увеличивается. Поддержка кода способна стать настоящей проблемой.</p>
112
<p>Рассмотрим несколько наиболее распространенных ситуаций:</p>
112
<p>Рассмотрим несколько наиболее распространенных ситуаций:</p>
113
<p>1.Возникновение неоднозначности. Такие ситуации возникают, когда у нескольких родителей имеются методы с одинаковыми именами. Здесь при компилировании "c54G…" просматривает наличие метода getID() у "Wireless…", который отсутствует. В итоге компилятор продвинется вверх по цепи, отыщет у родительских классовых элементов соответствующий "объект". Он обнаружен у USB и Network. В результате появится сообщение об ошибке, так как компилятор не поймет, какой именно ID использовать.</p>
113
<p>1.Возникновение неоднозначности. Такие ситуации возникают, когда у нескольких родителей имеются методы с одинаковыми именами. Здесь при компилировании "c54G…" просматривает наличие метода getID() у "Wireless…", который отсутствует. В итоге компилятор продвинется вверх по цепи, отыщет у родительских классовых элементов соответствующий "объект". Он обнаружен у USB и Network. В результате появится сообщение об ошибке, так как компилятор не поймет, какой именно ID использовать.</p>
114
<p>Для исправления ситуации достаточно внести уточнение:</p>
114
<p>Для исправления ситуации достаточно внести уточнение:</p>
115
<p>2."Алмаз смерти" или "Алмаз обреченности". Так называют ситуацию, при которой у классового элемента 2 родителя, каждый из которых уже наследовал свойства одного и того же "прародителя":</p>
115
<p>2."Алмаз смерти" или "Алмаз обреченности". Так называют ситуацию, при которой у классового элемента 2 родителя, каждый из которых уже наследовал свойства одного и того же "прародителя":</p>
116
<p>Во втором случае сканеры и принтеры служат устройствами. Питаются от розетки и получают свойства "Powered…". Но ксерокс объединяет эти два девайса. Поддержка такого кода способна привести не только в медленной работе утилиты, но и к непредвиденным поворотам.</p>
116
<p>Во втором случае сканеры и принтеры служат устройствами. Питаются от розетки и получают свойства "Powered…". Но ксерокс объединяет эти два девайса. Поддержка такого кода способна привести не только в медленной работе утилиты, но и к непредвиденным поворотам.</p>
117
<h3>В C#</h3>
117
<h3>В C#</h3>
118
<p>Также стоит выяснить, что такое упомянутое ранее множественное наследование, но уже в Си Шарп. Работать, как и в прошлых случаях, будем с public, несмотря на то, что обычно переменные и другие составляющие бывают private.</p>
118
<p>Также стоит выяснить, что такое упомянутое ранее множественное наследование, но уже в Си Шарп. Работать, как и в прошлых случаях, будем с public, несмотря на то, что обычно переменные и другие составляющие бывают private.</p>
119
<h4>Об интерфейсах</h4>
119
<h4>Об интерфейсах</h4>
120
<p>Но сначала обратим внимание на немаловажный момент - интерфейсы. Это инструмент реализации полиморфизма. Некий набор методов, обеспечиваемый классовыми составляющими, воплощающими в жизнь этот самый интерфейс.</p>
120
<p>Но сначала обратим внимание на немаловажный момент - интерфейсы. Это инструмент реализации полиморфизма. Некий набор методов, обеспечиваемый классовыми составляющими, воплощающими в жизнь этот самый интерфейс.</p>
121
<p>Содержит сигнатуры. Не может включать в себя:</p>
121
<p>Содержит сигнатуры. Не может включать в себя:</p>
122
<ul><li>конструкторы;</li>
122
<ul><li>конструкторы;</li>
123
<li>константы;</li>
123
<li>константы;</li>
124
<li>поля;</li>
124
<li>поля;</li>
125
<li>статистические составляющие.</li>
125
<li>статистические составляющие.</li>
126
</ul><p>Объявляется и используется по следующему примеру:</p>
126
</ul><p>Объявляется и используется по следующему примеру:</p>
127
<p>Вот ситуация, при которой класс должен реализовывать интерфейс посредством предоставления реализации всех членов последнего:</p>
127
<p>Вот ситуация, при которой класс должен реализовывать интерфейс посредством предоставления реализации всех членов последнего:</p>
128
<p>Интерфейсы необходимы для множественного "заимствования".</p>
128
<p>Интерфейсы необходимы для множественного "заимствования".</p>
129
<h4>О непосредственном "перенятии"</h4>
129
<h4>О непосредственном "перенятии"</h4>
130
<p>Множественное наследование в C - это процесс перенятия классовой составляющей сразу от двух родителей. В Шарпе данный вариант используется редко, так как ему на смену пришли интерфейсы. Здесь классовая составляющая способна реализовывать сразу несколько interfaces. Несмотря на это, "идентификатор" public в Sharp применяется, и весьма часто.</p>
130
<p>Множественное наследование в C - это процесс перенятия классовой составляющей сразу от двух родителей. В Шарпе данный вариант используется редко, так как ему на смену пришли интерфейсы. Здесь классовая составляющая способна реализовывать сразу несколько interfaces. Несмотря на это, "идентификатор" public в Sharp применяется, и весьма часто.</p>
131
<p>При реализации нескольких интерфейсов используется разделительный символ "запятая". Кодификация окажется следующей:</p>
131
<p>При реализации нескольких интерфейсов используется разделительный символ "запятая". Кодификация окажется следующей:</p>
132
<p>Тут:</p>
132
<p>Тут:</p>
133
<ol><li>Интерфейсом объявлен некий IDrawable. Это - метод рисования некоторого числа объектов.</li>
133
<ol><li>Интерфейсом объявлен некий IDrawable. Это - метод рисования некоторого числа объектов.</li>
134
<li>Может реализовывать Image.</li>
134
<li>Может реализовывать Image.</li>
135
<li>Circle и Image - разные сущности без базового class. Для устранения неполадок создается указатель на "главный" public интерфейс.</li>
135
<li>Circle и Image - разные сущности без базового class. Для устранения неполадок создается указатель на "главный" public интерфейс.</li>
136
</ol><p>Так, в Шарпе для "перенятия" множественного типа задействованы или abstract classes, или интерфейсы.</p>
136
</ol><p>Так, в Шарпе для "перенятия" множественного типа задействованы или abstract classes, или интерфейсы.</p>
137
<a></a><a></a><p>Также вам может быть интересен<a>курс "Программист C"</a>в Otus.</p>
137
<a></a><a></a><p>Также вам может быть интересен<a>курс "Программист C"</a>в Otus.</p>
138
138