ym104432846
Вставьте ссылку на видео из Youtube, Rutube, VK видео
Задайте вопрос по видео
Что вас интересует?
00:00:15
Понятие наследования в ООП:
  • Наследование позволяет одному классу (наследнику) получить все поля, аксессоры, конструкторы и методы другого класса (родителя).
  • Класс-наследник может содержать дополнительные поля, конструкторы и методы.
00:03:03
Создание класса-наследника:
  • Для создания класса-наследника указывается двоеточие и имя класса-родителя.
  • В C# допускается наследование только от одного класса.
00:04:04
Модификаторы доступа в наследовании:
  • Поля и методы с модификатором private доступны только внутри своего класса.
  • Поля и методы с модификаторами public и protected доступны в классах-наследниках.
00:04:50
Использование класса-наследника:
  • При создании объекта класса-наследника автоматически доступен функционал класса-родителя.
  • При использовании конструктора важно учитывать необходимость передачи параметров в конструктор родительского класса.
00:06:37
Добавление дополнительного функционала в класс-наследник:
  • В классе-наследнике можно добавлять новые аксессоры и методы, недоступные в классе-родителе.
  • Пример добавления метода "лазер" для стрельбы лазером.
00:08:38
Перегрузка конструкторов в классе-наследнике:
  • Возможность создания нескольких конструкторов в классе-наследнике, включая конструктор по умолчанию.
  • Передача параметров в конструктор родительского класса через двоеточие и ключевое слово base.
  • Вызов методов родительского класса из конструктора наследника через base.
00:12:57
Модификатор доступа protected:
  • Модификатор protected обеспечивает доступ к элементам класса в самом классе и в классах-наследниках.
  • Примеры использования полей и методов с модификатором protected в классе-наследнике.
00:15:45
Применение наследования в реальных проектах:
  • Примеры применения наследования в разработке игр, приложений и веб-сайтов.
  • Преимущества использования наследования для расширения функциональности классов.
0: Привет, в ходе этого урока мы с вами поговорим об 1 из важнейших концепций в программировании, особенно в ооп про концепцию наследования, а перед началом я бы хотел порекомендовать сайт it прокер точка ком. На этом сайте вы найдёте код, домашнее задание и много другое.
1: Полезной информации. Ссылка на этот урок на сайте будет в описании. К этому видео переходите, не пожалеете, что такое наследование? Наследование это когда у нас есть некий класс, родитель и дальше мы создаём ещё 2 класс и делаем так, что наш 2 класс, он будет
2: Все наследовать от класса родителя. Вот например у нас есть класс робот и я могу создать ещё 1 некий дополнительный класс и этот 2 класс он будет являться наследником для класса робот и соответственно он будет наследовать полностью все
3: Все те поля, а также полностью все те аксессоры, конструкторы и методы, которые есть здесь внутри самого этого класса. Плюс данный класс наследник, он сможет иметь ещё дополнительные какие-то свои поля, дополнительные какие-то конструкторы.
4: Аксессоры, методы и все в таком вот духе. И давайте мы, пожалуй, такую концепцию с вами как раз сейчас и разработаем. То есть создадим класс, который будет являться наследником для класса робот. Зачем нам такое вообще может понадобиться. Дело в том, что внутри нашего
5: Основного файла внутри нашего основного класса. Здесь есть несколько уже объектов. И, например, есть такой объект, который называется как killer. Было бы логично, чтобы этот объект он был создан на основе какого-то другого класса, потому что наш объект
6: Killer он явно имеет какие-то дополнительные функции, в отличии, в отличие от обычных объектов бот, да, ну, например, у этого объекта, у объекта киллер могла быть бы функция, за счёт которой он бы, например, стрелял лазером.
7: Ну, если мы разрабатываем игру, то, например, вот такую бы функцию можно было бы добавить, да, и реализовывать эту функцию внутри основного класса будет нелогично, потому что для наших обычных Ботов вот этой вот функции, ну, не должно быть, они слишком простые у них этой функции.
8: Просто не должно быть. А, например, у киллера такая же функция должна быть. Ну и, соответственно, как мы можем поступить? Мы можем вообще, в принципе, создать отдельный новый класс. И в этом новом классе мы бы могли переписать полностью все тоже самое, что у нас было бы вот здесь.
9: В основном классе робот это 1 вариант. Ну и 2 вариант мы бы могли создать класс наследник, указать то, что мы наследуем все от класса робот. То есть базовый функционал мы бы уже не переписывали, а лишь дописали бы дополнительные какие-либо функции, за счёт которых мы
10: Мы бы как раз и реализовали, например, стрельбу лазером. Ну, возьмём уже для примера, как раз эту функцию, поэтому давайте мы сейчас такое с вами и реализуем. Итак, для реализации нам необходимо создать новый файл. Новый файл можно называть как угодно, но
11: Поскольку мой класс будет называться как killer, поэтому я именно так и назову данный файл дальше, я предлагаю, возможно, немножко скопировать кода. Ну хотя тут особо много можно и не копировать. Я просто скопирую юзинг систем, а также неймспейс проджект, да, то есть тот же самый нейм.
12: Используем, ну и в общем то больше ничего не копируем. Дальше мы указываем с вами то, что мы создаём здесь класс, наш класс, он уже будет называться как киллер. И на данный момент я создал самый обычный класс, да, он ничего не наследует. Это самый обычный класс, чтобы указать то, что мы наследуем.
13: Все от определённого класса. Мы здесь указываем двоеточие и указываем, от какого класса мы все с вами можем наследовать важный нюанс. Здесь наследование может производиться только от 1 единственного класса. То есть нельзя записать через запятую, что мы наследуем ещё от
14: Других классов здесь нету множественного наследования, в отличие от того же самого языка си, плюс плюс там это есть, это считалось плохой функцией, плохой функцией самого этого языка. Ну и, соответственно, в сишарпе этот функционал они удалили, урезали, так сказать,
15: Поэтому здесь мы можем наследовать только от 1 единственного класса. Ну и смотрите, что я сейчас имею. Я сейчас имею то, что данный класс, он наследует все от класса робот и по сути хоть этот класс и является полностью сейчас пустым, но все равно внутри этого класса
16: Мы имеем доступ ко всем тем полям, аксессорайз, а также методам, которые имеют модификаторы доступа, либо паблик, либо протектед. И вот как раз в этом уроке мы уже поговорим с вами относительно вот этого модификатора доступа. Protected. Вот, но Чут,
17: Позже мы затронем эту тему. Если мы говорим про модификаторы доступа private, то все-таки вот эти вот все поля или же методы, у которых есть данный модификатор доступа, они будут доступны только внутри самого этого класса. Но если мы говорим про модификатор,
18: Доступа public или же протектед, то вот эти вот все поля и методы и все в таком духе они уже будут доступны во всех ещё дополнительно классах, наследниках. Ну и по поводу протектед мы давайте чуть позже с вами все-таки это обсудим пока мы давайте просто попро
19: Создать объект на основе именно нашего класса, наследника, чтобы такое сделать. По сути, все, что мы можем здесь поменять. Так это мы указываем теперь, что мы создаём на основе, на основе такого класса, как killer. Мы создаём объект, который тоже будет называться как киллер. И здесь, соответственно,
20: Выделяем память именно под killer. Если я сейчас такое все сохраню и запущу, то, как ни странно, нам вообще больше ничего дописывать и менять не нужно. Вот вы можете сейчас заметить, что у нас все срабатывает абсолютно точно так же само.
21: Так и работало до этого, да, никакие методы не поломались, вообще ничего как бы кардинального не произошло. Почему так происходит? Дело в том, что, да, наш класс, он полностью пустой, но опять же, у нас есть различные методы, различный функционал, который есть в основном
22: Классе. Поэтому, когда я здесь создаю объект на основе дочернего класса, на основе класса наследника, то я все равно имею доступ ко всем этим полям и ко всем этим методам, которые есть в основном классе. Поэтому я спокойно обращаюсь к сетелю.
23: Я спокойно обращаюсь к принт вельюс и все это здесь работает корректно. У вас, например, сейчас может что-то не сработать. Просто по той причине, что вы, например, здесь используете какой-либо конструктор, да, конструкторы можно использовать из родительского класса, но их просто ещё необходимо будет пере.
24: Писать внутри дочернего класса. Опять же мы это с вами будем делать. Поэтому если вдруг вот вы сейчас здесь передаёте какие-либо параметры при создании самого объекта, да, то удалите все эти параметры и используйте конструктор по умолчанию. В таком случае, конечно же код будет выполняться корректно.
25: Ну, а чуть позже мы перепишем ещё конструктор и научимся передавать данные сразу в, ну, в класс родитель, да, пока это просто не будем с вами затрагивать. Что мы имеем. Мы имеем то, что мы можем работать со всеми теми вещами, которые находятся в основном классе, но дополни.
26: Мы спокойно можем ещё и дописать какой-то другой дополнительный свой функционал внутри класса киллер. Вот например здесь я бы, наверное хотел дописать ну допустим даже давайте мы допишем акцессор, ну, например, что-то в этом духе. И этот аксессори, н, будет называться как
27: Hells, то есть это уровень будет здоровья, и здесь мы его сможем с вами получать, а также мы его сможем с вами устанавливать. Да, и в таком случае мы имеем теперь доступ к этому аксессори yours, сам этот объект. То есть я здесь могу обратиться к killer, могу обра.
28: Jack hells и могу установить значение как 100, например да, то есть уровень здоровья будет как 100 в то же время для других наших объектов, например для бота не существует такого аксессорайз к хелс, потому что внутри класса робот, ну такого аксессорайз ь только.
29: Дочернем классе. Таким образом мы с вами получаем полностью весь необходимый базовый функционал плюс можем ещё дописать какой-то свой дополнительный функционал для нашего вот этого вот класса наследника. Это максимально удобно. Вот например мы давайте даже ещё здесь все-таки допишем кое-что мы до
30: Пишем некий метод, который у нас будет как раз стрелять. Допустим, лазером. Конечно, мы не будем такое реализовывать прям полноценно, да, но просто создадим некий экземпляр данного данного метода и здесь мы его назовём, этот метод, пускай как лазер.
31: Допустим, так, у него будет такое, у него будет название, все, что здесь будет происходить, это просто вывод информации в консоль, да, конечно же, потом в полноценных играх или в приложениях вы можете реализовывать здесь функционал, что там будет какой-то у вас объект передвигаться или будет что-то стрелять. Но на данный момент все, что мы делаем, это просто пи.
32: В консоль, да. Ну и здесь, например, мы будем писать, например, лазер, шутинг, ну, что-то в этом духе, да, стрельба лазером. И теперь я спокойно могу взять этот объект, могу обратиться к методу лазер и, конечно же, он у нас
33: Сработает. Давайте мы это все запустим и мы заметим, что у нас будет выписываться ещё лазер шутинг. Вот оно здесь у нас и выписалось, да, то есть абсолютно также все корректно сработало. Таким образом имеем общий функционал и плюс добавляем к этому общему функционалу ещё какой-либо свой
34: Дополнительный функционал внутрь класса наследника. Мы давайте допишем ещё использование определённого конструктора. Здесь мы прописываем обычный конструктор, то есть мы прописываем паблик. Дальше нам необходимо конструкторы называть точно так же, как и называются у нас сами классы. В моём случае я прост
35: Прописываю здесь киллер. Ну и вот если ещё просто дописать фигурные скобки, то это будет конструктор по умолчанию. Да, давайте мы, возможно, такой конструктор тоже здесь оставим, пускай у нас будет ещё и конструктор по умолчанию помимо конструктора по умолчанию у нас у нас также будет ещё конструктор, который
36: Будет принимать несколько значений. Мы давайте, возможно, скопируем эти значения из другого нашего класса, чтобы просто их не переписывать. То есть я буду принимать полностью все вот эти вот значения, буду принимать имя, буду принимать вес самого этого.
37: Робота будут принимать координаты, а дополнительно я ещё и пускай буду принимать некий интеджер и это будет хелс, который я буду устанавливать внутрь самого этого аксессорайз. Да, вот такая вот вещь, что мне необходимо внутри самого этого
38: Конструктора прописать. По сути, мне мне не нужно устанавливать вот эти вот параметры внутри этого конструктора, потому что эти параметры мне необходимо было бы передать внутрь класса родителя здесь, внутри самого этого конструктора все, что я бы хотел сделать, так это обратиться
39: Просто к хелс, и здесь установить то значение, которое мы передаём в качестве параметра. Все же остальные значения я бы хотел передать в класс родитель, поэтому здесь я просто ставлю двоеточие, дальше указываю Бейс и basse это, по сути, обращение к
40: Классу родителю, то, что мне как раз и нужно. Здесь же я просто указываю, какие параметры я буду передавать. Я передаю параметры name, также Вейт, а также дополнительно координатс, да, вот эти 3 параметра они будут переданы в класс родитель, и там они будут переданы в
41: Тот конструктор, который будет подходить под эти параметры. В моём случае у меня тут только 1 конструктор, который подходит под эти параметры. Вот этот конструктор, он принимает 3 параметра. Если бы я передавал лишь 1 параметр. Ну, допустим, если бы я здесь указал, что передаю только параметр.
42: То в таком случае по по умолчанию был бы выбран именно этот конструктор, где принимается только 1 параметр. Я же передаю 3 параметра, поэтому они будут добавлены внутрь этого конструктора и здесь же они будут установлены к самому объекту. Получается мы
43: Создали с вами даже 2 конструктора. В 1 конструктор мы ничего можем не передавать. А во 2 конструктор мы передаём полностью все эти значения, все, ну почти все значения передаются ещё в родительский класс, и лишь 1 значение устанавливается конкретно для поля, которое на
44: Находится внутри самого этого класса. И что мы теперь имеем? Мы имеем то, что я могу прописать полностью все вот эти вот значения вот здесь сет Велюс, в принципе могу теперь удалить, а также могу ещё сюда дописать ну ещё 1 значение, это уже
45: Как бы жизнь самого этого нашего робота. Здесь мы устанавливаем ячейку, ну, значение как 100, и это уже будет установлено для нашего аксессорайз. Соответственно, установку хелс мы уже теперь тоже отсюда можем удалить. То есть вся установка теперь происходит конкретно при создании самого объекта. И ещё 1 момент, если
46: Из класса наследника вам необходимо вызвать некий метод, который находится в классе. Родители, то в таком случае вы можете использовать тоже вот это вот ключевое слово bass. Вот. Допустим, я здесь хочу установить все значения. А дальше я бы хотел сразу же вызвать метод, который называ
47: Print вельюс. Ну и чтобы мне такое сделать, я не могу просто здесь прописать print вельюс. Ну, в принципе, это может сработать, но это не самая идеальная конструкция. Лучше здесь всегда прописывать бэйс. То есть мы как бы обращаемся к основному нашему классу и дальше
48: Уже из этого класса мы выбираем принт вельюс. В таком случае оно 100% у вас будет срабатывать. Ну и вот даже при наведении мы можем заметить, что мы как бы обращаемся к классу робот и там уже находим именно принт вельюс то, что мне и нужно. И давайте мы тогда ещё и закомментируем киллер.
49: Values, вот этот вот метод, он также здесь теперь нам не нужен. Если я сейчас это все попробую запустить так, 2 секунды, то мы заметим, что все обработается абсолютно корректно. Весь код он сработает, как и срабатывал раньше. Вот оно тут все выводится.
50: Ну и соответственно, теперь у нас вся установка данных, она происходит именно через конструктор. Плюс ещё и в конструкторе мы обращаемся к родительским методам и также спокойно с ними работаем, они спокойно здесь выводятся. Ну и в этом уроке нам ещё осталось лишь 1. Нам необходимо с вами у
51: Знать, что же все-таки делает модификатор доступа, protected если говорить про такие модификаторы доступа как public и private, то здесь все достаточно просто public говорит о том, что доступно отовсюду прайвет говорит, что доступно только внутри самого класса, где это было создано.
52: Если мы говорим про протектед, то в таком случае это означает то, что данное данное поле, данный метод, конструктор, акцессор или что-либо угодно другое, что вот эта вот вещь, она будет доступна в классе, где она была создана.
53: А также во всех классах, наследниках. Ну и вот, например, давайте я создам здесь некое поле, у которого будет модификатор доступа, как протектед. Это поле, оно пускай будет, оно пускай будет как string. Ну и возможно, это будет просто как sir нейм, я не знаю, пускай это будет как фамилия.
54: Для нашего робота, возможно, это бессмысленная штука, но пускай будет ещё такое дополнительное поле. И что мы теперь имеем? Если мы попробуем обратиться к этому полю внутри этого же класса, то у нас это, конечно же, сработает. Да, никаких проблем в этом не будет. Если же я через
55: Объект. Попытаюсь обратиться к этому полю, то, как видите, здесь даже не выдаётся сама эта подсказка. Ну и если я буду пытаться здесь что-то установить, то, конечно же, будет выдаваться ошибка, потому что доступа к этому полю у меня попросту нет. Вы можете заметить, что видите, здесь есть протекшн.
56: Есть, ну, как бы, защита к этому полю. Соответственно, через объект мы значение установить в это поле не можем, но зато мы можем спокойно к этому полю обратиться через наш класс. Наследник в этом не будет никакой проблемы. Вот, например, давайте вот здесь, ну, или здесь, или
57: Давайте вот возможно, в этом методе мы можем спокойно обратиться к base, то есть мы можем обратиться к родительскому классу или же можно здесь прописать просто как this по сути, если мы прописываем зис, это будет примерно тоже самое, потому что мы как бы обращаемся к этому классу.
58: Но в этом же классе у нас есть функционал основного класса, да, поэтому это тоже здесь сработает. Ну, в любом случае прописываем либо Бейс, либо this. И здесь мы обращаемся с вами к сер нейм. И тут, если я попробую установить некую фамилию, ну, допустим, до просто здесь
59: Будет написано, да, то в таком случае все сработает без каких-либо нюансов. Таким образом, мы имеем то, что мы создали то поле, которое возможно редактировать как в основном классе, где оно было создано, так и в классах, наследниках, как вот у меня здесь сейчас и получилось.
60: Ну то есть я здесь установил какое-то новое значение и дальше это значение я бы мог ещё вывести на экран или проделать какие-либо манипуляции. Таким образом, протектед это именно та вещь, это именно тот модификатор, который используется, ну, по сути, исключительно если у вас есть наследование для вашего
61: Класса, как вы можете понимать, не все классы, они у вас будут идти с наследованием. Ну просто по той причине, что некоторые классы, они будут достаточно маленькие и для них просто не нужно будет ещё создавать классов Наследников. В нашем случае я взял такой огромный класс, как робот, но по сути роботов
62: Существует огромное множество, и для каждого определённого типа робота можно было бы создавать отдельный класс, да, то есть, например, можно было бы создать ещё 1 класс, который там бы назывался как просто бот, и тоже сделать, что этот класс будет наследником класса робот и у
63: У него там будут какие-то свои дополнительные примитивные функции, например, да, там какие-то методы. Вот, то есть подобных классов Наследников здесь может быть много, но на самом то деле, конечно же, есть и классы, как, например, класс, который будет описывать соединение с базой данных, и такой класс, он может быть уже как класс одиночка.
64: Где вы просто подключаетесь к самой базе данных и в принципе, вам не нуж, ну вам не нужны ещё какие-то дополнительные классы, наследник это просто будет уже возможно лишним. Ну что же, вот так и реализовывается наследование в языке сишарп. Наследование это очень часто применяем.
65: Функция в самом этом языке. И конечно же когда вот вы будете разрабатывать там игры, приложения, веб сайты, да, и в принципе любые другие проекты вы постоянно будете замечать то, что используется наследование, когда у вас есть какой-то класс родитель и вы просто наследуете от него
66: Полностью весь функционал плюс добавляете некий дополнительный свой функционал, который нужен будет конкретно только для этого класса, только для определённого случая. У меня на этом все. Надеюсь, урок вам понравился. Если так, то не забывайте подписываться на канал, вступать в группу вконтакте, а также переходить н.
67: Fight, it прогер, точка ком. Все ссылки будут в описании к