C# Strategy Стратегия | Design Patterns

  Рет қаралды 27,659

codaza

codaza

Күн бұрын

Паттерны проектирования важно и нужно знать. В этом ролике мы поговорим про design pattern Strategy (Стратегия) - поведенческий шаблон проектирования. Поговорим о сути, посмотрим на примеры и сделаем реализацию в Visual Studio 2022 и .NET 6. Заходите, будет интересно и станет понятно 🙂
Исходный код проекта на GitHub: github.com/codaza/Attacker
Telegram канал: t.me/codaza
На кофе ☕️: pay.cloudtips.ru/p/179d0532
Patreon: / codaza
Boosty: boosty.to/codaza
0:00 - Начало
0:39 - Strategy это Behavioral Design Pattern
1:19 - Проблема
4:35 - Концепция Strategy
6:07 - Анатомия Strategy
7:57 - Live example
8:22 - Реализация примера
18:29 - Завершение
#strategy #designpatterns #ityoutubers #ITubeTeam #gof #csharp #net6 #паттерныпроектирования #codaza

Пікірлер: 128
@codaza-channel
@codaza-channel 2 жыл бұрын
Удобная навигация по видео :) 0:00 - Начало 0:39 - Strategy это Behavioral Design Pattern 1:19 - Проблема 4:35 - Концепция Strategy 6:07 - Анатомия Strategy 7:57 - Live example 8:22 - Реализация примера 18:29 - Завершение
@yaric99
@yaric99 2 жыл бұрын
Очень доступно объясняешь! Супер! Надеюсь, мы будем и дальше изучать шаблоны по твоим урокам!
@user-ed6tq4vn8o
@user-ed6tq4vn8o 2 жыл бұрын
Это просто высшее качество реализации обучения. Мои глаза, ушки приятно отдохнули, а мозг все понял. Спасибо.
@chinchilla898
@chinchilla898 2 жыл бұрын
Просто класс! Огромное спасибо! Мне очень понравился пример со Сквидвардом. Теперь понимаю где допускал ошибки в своих пет проектах.
@BrownAleks
@BrownAleks Жыл бұрын
Очень жду новых видео роликов от Вас... И сдаётся мне такое ощущение, что их уже не будет. Очень печально. =( Вы бы хоть причину назвали, почему решили бросить. У вас видео получается на уровне между "шедевр" и "божественно!"
@lkn1ghtl
@lkn1ghtl 2 ай бұрын
Он в своём тг ответил, что сейчас работает над большими проектами, поэтому не может делать видео.
@BrownAleks
@BrownAleks 2 ай бұрын
@@lkn1ghtl на дату иногда поглядывайте. Для меня это уже не актуально.
@lkn1ghtl
@lkn1ghtl 2 ай бұрын
@@BrownAleks Ну может кто-то другой бы интересовался, почему бы не ответить?
@olegalikin929
@olegalikin929 2 жыл бұрын
Это лучшее что я когда либо видел. Видео ряд, звуковое сопровождение и конечно подача материала🔥
@brain3361
@brain3361 2 жыл бұрын
Теперь все ясно ! Благодарю.
@PAPAKOTT
@PAPAKOTT 2 жыл бұрын
Как всегда, очень круто. И понятно.
@VitVit312
@VitVit312 2 жыл бұрын
Каеф, рад что твой канал растёт, очень доходчиво поясняешь :)
@user-zu1tm4mo2k
@user-zu1tm4mo2k 2 жыл бұрын
Как же всё становится просто! Респект!
@voffkaboo7183
@voffkaboo7183 2 жыл бұрын
огромное спасибо! Очень четкое пояснение, удачи с развитием канала)
@Bushido_Cat
@Bushido_Cat Жыл бұрын
Спасибо за урок, очень интересно и понятно 😊
@klimofei
@klimofei Жыл бұрын
Спасибо! Отличное объяснение. Все понятное сразу стало.
@andrewalexart
@andrewalexart Жыл бұрын
Топовое качество объяснения. Спасибо!
@TheKaazus
@TheKaazus Жыл бұрын
Спасибо, очень приятный и полезный ролик.
@user-sb4kj4pt4o
@user-sb4kj4pt4o 2 жыл бұрын
Видос топ. Доступно и понятно. Спасибо =)
@ArmDinamit
@ArmDinamit Жыл бұрын
очень благодарен за ваш труд
@NNNNN-sb1ev
@NNNNN-sb1ev 2 жыл бұрын
Реально стало понятно Спасибо.
@user-yo7mw6oj4p
@user-yo7mw6oj4p 2 жыл бұрын
Спасибо, въехал)))
@youchinafriend
@youchinafriend 2 жыл бұрын
Слишком годно, продолжай 😎💥
@alexsorokin8373
@alexsorokin8373 Жыл бұрын
Большое спасибо!)
@matthewgiovannini2360
@matthewgiovannini2360 9 ай бұрын
Спасибо! Рассказываешь лучше, чем лицензированный Майкрософт чел из МТС, который половину выдаёт на платных курсах, а бесплатными видео только заманивает. Объяснения лучшие, пример отличный)
@familyplugnikovhome4002
@familyplugnikovhome4002 4 ай бұрын
Отличное объяснение !
@tilllindemann9794
@tilllindemann9794 Жыл бұрын
Спасибо за видео
@user-pq9of5nz2w
@user-pq9of5nz2w 2 жыл бұрын
Очень круто! Спасибо!
@codaza-channel
@codaza-channel 2 жыл бұрын
На здоровье 💙
@sportshomeworkout3834
@sportshomeworkout3834 Жыл бұрын
круто, спасибо за твой контент, спонсировать не чем пока но рекламы смотрю не пропуская, хоть так какая то копеечка тебе капнет, очень годный контент
@superpetros26
@superpetros26 Жыл бұрын
Кодаза! Давай ещё!
@nkochubashev
@nkochubashev Жыл бұрын
Оболденная подача! Впрочем, вы сами это знаете :)
@user-pq1gn7qz3f
@user-pq1gn7qz3f 2 жыл бұрын
начал писать консольную игру "саймон говорит" с простыми заданиями чисто для практики, типа верх право прыжок и задумался над расширением команд. нашел ваше видео. это самый быстрый и доходчивый вьезд в паттерн получился. Спасибо!
@codaza-channel
@codaza-channel 2 жыл бұрын
Классно что сразу же применяете знания на практике 👍 Рад, что видео оказалось полезным!
@VolkGam
@VolkGam 2 жыл бұрын
Ну, и чтобы совсем всё было правильно, нужно добавить интерфейс IHero с методом Attack() и реализовать его. Отличный пример, большое спасибо!
@crazy-man
@crazy-man Жыл бұрын
Смотрю уроки по Солид но несмотря каждый день возвращаюсь к своему проекту и переписываю код)
@constantin3280
@constantin3280 10 ай бұрын
Я просто в шоке, такой контентный контент я только что посмотрел!
@TheKr0ckeR
@TheKr0ckeR 2 жыл бұрын
spasiba drug
@phat80
@phat80 2 жыл бұрын
Хоть и понимаю этот паттерн, поддержу просмотром!
@SDesuu
@SDesuu Жыл бұрын
Один из лучших каналов на которых можно понять базовые вещи по той или иной теме, без ненужной воды и тд, жаль что очень недооценен канал
@user-lp5gp8qs7b
@user-lp5gp8qs7b 2 жыл бұрын
🔥🔥🔥
@illiavolha5129
@illiavolha5129 2 жыл бұрын
Лучший. Включи воз ожность спон, орства канала, стану донатить пару бак ов в месяц. И ещё запусти мерч с чайкой
@codaza-channel
@codaza-channel 2 жыл бұрын
Благодарю! По спонсорству, там пока не хватает необходимого количества часов просмотров. Как наберется, можно будет включить. Идея с мерчом интересная, подумаю об этом :)
@aarongrimes9276
@aarongrimes9276 2 жыл бұрын
Забавно, что я этим давно пользовался, но не знал что это паттерн стратегия
@codaza-channel
@codaza-channel 2 жыл бұрын
У Вас было опытно-интуитивное знание, теперь добавилось еще и формальное, что тоже хорошо)
@panarth1142
@panarth1142 16 күн бұрын
Первое что приходит в голову у новичка - создать класс пухи с различными характеристиками, задавать поведение через конструктор её экземплярам и передавать их уже в целевой класс. Возможно ты пользовался этим подходом? Интерфейсы начинаешь применять когда у объектов совсем уж разная логика, например красная бочка и враг, ну или для всяких кнопок
@user-ls7xz8jc4v
@user-ls7xz8jc4v 8 ай бұрын
Манера изложения автора не оставляет мне шансов быть недоучкой по С# , спасибо автор, снимаю шляпу перед вашим талантом гипнотического воздействия на способность сконцентрировать все ресурсы мозга на впитывание материала
@grol5555
@grol5555 2 жыл бұрын
Хорошее видео, всё понятно. Но маленький нюанс, можно сделать размер шрифта в IDE в будущих видео чуть больше? На слайдах код прекрасно видно, а вот в IDE я его на слух восстанавливаю. А сидеть сильно близко к телевизору, чтобы всё увидеть, неудобно.
@codaza-channel
@codaza-channel 2 жыл бұрын
Благодарю за комментарий. Да, в будущих роликах сделаю шрифт крупнее :)
@alexsoft999
@alexsoft999 Жыл бұрын
Вроде на UML диаграмме неправильно указано включение Стратегии в контекст. Ромбик должен быть с другой стороны, там где контекст.
@x0x617
@x0x617 Жыл бұрын
Какой же хороший звук, аж приятно слушать.
@FixedA
@FixedA Жыл бұрын
Подскажи пожалуйста, в чем смысл данного паттерна когда есть внедрение зависимостей?
@valdemarconst7038
@valdemarconst7038 5 ай бұрын
А как в очередной реализации стратегии мы можем обратиться к свойствам контекста-сквидварда. А то тогда не понятно зачем это все. Что если в реализации орудия умерщвления, нам нужно менять состояние контекста, например сквидвард задержал гранату в руке и она взорвалась и теперь он должен получить урон? А то они будто все в воздухе подвешены и ни к чему не привязаны. Это сильно ограничивает возможности реализации.
@user-vv6uw9wb5e
@user-vv6uw9wb5e 2 ай бұрын
Возвращайиесь, пожалуйста....
@user-yx7jr3vw2c
@user-yx7jr3vw2c 2 жыл бұрын
Все понятно, доступно, круто и т.д., но у меня вопрос. мы вот это все реализовали, но как это нормально дергать и дать фронтам на растерзание я не понимаю. Ты в Main передаешь конкретные имплементации, но что если мы напишем апи, где параметр будет как раз одно из значений энамки с видео (WaterGun, Plumber, Broom), а мы уже в зависимости от этого параметра должны установить в метод SetWeapon конкретную реализацию интерфейса. У меня в голове все сводится опять же к switch который нарушает вторый принцип SOLID. Типо: IWeapon weapon = gunType switch { WaterGun => new WaterGun(), Plumber => new Plumber(), Broom => new Broom() }; hero.SetWeapon(weapon); ... Опять все это придется каждый раз модифицировать при появлении нового значения в энамке. Это можно как то обойти?
@codaza-channel
@codaza-channel 2 жыл бұрын
Иван, если у Вас есть необходимость избавиться от switch и enum, то можно: 1. Предоставить в API отдельные endpoint-ы под каждый вид оружия. 2. Пробрасывать вызовы, используя паттерн CQRS, на конкретные имплементации обработчиков (handlers). Роутинг можно обеспечить по атрибутам.
@justraccoon3047
@justraccoon3047 Жыл бұрын
Видео как всегда на высоте, но есть и вопросы. По сути, это же можно реализовать через полиморфизм и тут вопрос, это сам паттерн такой, что позволяет делать выбор в ту или иную сторону или же просто пример так совпал?
@dronsan-unity7302
@dronsan-unity7302 Жыл бұрын
Через полиморфизм будет другой паттерн - Visitor (посетитель). Смысл паттерна убрать жесткую зависимость между классом использующим оружие и его поведением. Мы типо написали абстракцию, что хотим, чтобы героя атаковал, а как, чем, это ему не известно
@justraccoon3047
@justraccoon3047 Жыл бұрын
@@dronsan-unity7302 Благодарю, посмотрю ещё про тот паттерн
@dronsan-unity7302
@dronsan-unity7302 Жыл бұрын
@@justraccoon3047 да не за что!
@Alina_Dev
@Alina_Dev 8 ай бұрын
Почему такие авторы, как Codaza, Simple Code перестают выпускать видео?! Только появляется надежда, что я пойду все темы в программировании и баац они исчезают из ютуба( Да, понимаю запись новых роликов занимает очень много времени, учитывая ваш щепетильный подход ко всем деталям, но со временем это, наверное, можно было бы как-то масштабировать и выйти на существенный доход...
@user-iv3eh4hp3z
@user-iv3eh4hp3z 2 жыл бұрын
Доброго времени суток. А что значит знак вопроса на 12:46 в строчке private IWeapon? _weapon;
@codaza-channel
@codaza-channel 2 жыл бұрын
Привет 👋 Это означает, что мы даём явное указание на то, что переменная может принимать значение null. Если в свойствах проекта Visual Studio 2022, отключить настройку Nullable Context, то, для ссылочных типов, знак вопроса можно не указывать.
@user-iv3eh4hp3z
@user-iv3eh4hp3z 2 жыл бұрын
@@codaza-channel спасибо!
@user-uz3hc2hu9o
@user-uz3hc2hu9o 11 ай бұрын
То есть можно сказать, грубо говоря, что это просто соблюдения 1ого принципа solid с единым интерфейсом для схожих классов?
@MrWhite-vp4xz
@MrWhite-vp4xz Жыл бұрын
С таким же успехом паттерн Стратегия можно назвать Тактика.
@user-lu8ee8xg1l
@user-lu8ee8xg1l Жыл бұрын
+
@kl45gp
@kl45gp Жыл бұрын
мало, очень мало лайков!
@codaza-channel
@codaza-channel Жыл бұрын
Поднажмём 😬
@kitemanrus
@kitemanrus 2 жыл бұрын
Спасибо за видео, но на 12:12 звук на минуту пропадает.
@codaza-channel
@codaza-channel 2 жыл бұрын
Благодарю за комментарий. К сожалению, KZfaq вырезал фрагмент из-за фоновой музыки.
@alexandr1408
@alexandr1408 2 жыл бұрын
Вопрос. А почему в данном случае не использовался абстрактный класс Weapon, и его конкретные реализации? Это же само напрашивается. Или я не прав?
@codaza-channel
@codaza-channel 2 жыл бұрын
Введение абстрактного класса имеет смысл, когда у нас есть некоторый базовый функционал, который переиспользуется в наследниках. В примере, который мы рассматриваем в видео, производится простой вывод на консоль. На мой взгляд, введение дополнительного слоя абстракции внесло бы избыточную сложность, которая не нужна для понимания механики паттерна Strategy. В рельных проектах, где Weapon имеет общую логику, абстрактный класс была бы весьма кстати. Так что вы верно уловили суть 🙂
@zungzao
@zungzao Жыл бұрын
спасибо, нифига не понял хД
@dilshodkomilov9121
@dilshodkomilov9121 2 жыл бұрын
Спасибо! У меня есть вопрос. Изначально было сказано, что метод Attack принимает параметр GunType, почему бы не задать IWeapon в качестве параметра для метода Attack, а создать метод SetWeapon? Это какое-то правило?
@codaza-channel
@codaza-channel 2 жыл бұрын
Именно это было сделано при реализации живого примера (таймкод: 13:16). Возможно я не понял суть вашего вопроса или Вы не досмотрели видео до конца.
@dilshodkomilov9121
@dilshodkomilov9121 2 жыл бұрын
@@codaza-channel Нет, вы не поняли. Почему нужен метод SetWeapon? Почему не сделать метод void Attack(IWeapon weapon) ?
@codaza-channel
@codaza-channel 2 жыл бұрын
@@dilshodkomilov9121 В ролике я показал классический вариант паттерна Strategy, который предполагает указание стратегии отдельно от выполнения операции. Вариант с указанием стратегии при вызове операции так же является допустимым. Здесь нет строгих рамок.
@aaa_aaa6226
@aaa_aaa6226 2 жыл бұрын
@@codaza-channel А если IWeapon передать в качестве необязательного параметра конструктора?
@codaza-channel
@codaza-channel 2 жыл бұрын
@@aaa_aaa6226 Так можно сделать если ваш герой должен быть без оружия или с одним видом оружия на протяжении всей игры. Не думаю что это актуальная логика для игры, но если вам нужно именно такое поведение, то можно так 🙂
@tarlanismailov5228
@tarlanismailov5228 2 жыл бұрын
Можно ли сказать, что суть паттерна стратегия - это использовать интерфейсы по назначению?
@codaza-channel
@codaza-channel 2 жыл бұрын
Нет, это будет слишком общее определение. Интерфейсы используются по назначению в самых разных ситуациях, выходящих далеко за рамки паттерна Strategy. Если вы хотите услышать суть паттерна одной фразой, то это скорее будет звучать так: выделение схожих алгоритмов с возможностью их использования в объектах, при помощи интерфейсов.
@antont8401
@antont8401 Жыл бұрын
А если анимация героя зависит от типа оружия. А также, если не все оружия могут быть использованы героем. Как быть?
@user-zp7yf7rr9d
@user-zp7yf7rr9d 11 ай бұрын
Действуйте по аналогии с оружием - юзайте паттерн стратегия.
@uprekayshiy_goose
@uprekayshiy_goose 11 ай бұрын
А если сделать так что бы просто заменялось название оружия? Разве это не дублирование кода?
@user-zp7yf7rr9d
@user-zp7yf7rr9d 11 ай бұрын
Безусловно можно и даже нужно.
@_MrMaser_
@_MrMaser_ 2 жыл бұрын
Привет! будет паттерн наблюдатель?
@codaza-channel
@codaza-channel 2 жыл бұрын
Привет! Пока никто не просил. Посмотрим на активность, если будет интересно многим, рассмотрим на канале 🙂
@user-hg5mt8lz2y
@user-hg5mt8lz2y 2 жыл бұрын
@@codaza-channel тогда я попрошу записать видео об этом паттерне)
@user-nc6ek7yl8h
@user-nc6ek7yl8h Ай бұрын
А кто то пояснит зачем нужно было создавать отдельный класс под разное оружие? Разве это не противоречит принципам solid, в том плане, что можно было унаследовать классы или использовать полиморфизм
@user-vb9gp9ly1x
@user-vb9gp9ly1x Жыл бұрын
А если нужно будет добавить новое оружие, то надо создать новый класс оружия и прописать его как вантус, водный пистолет и т.д.?
@dronsan-unity7302
@dronsan-unity7302 Жыл бұрын
просто создаешь этот класс оружия, реализуешь от интерфейса IWeapon и потом у героя сможешь использовать это оружие
@aleksey8405
@aleksey8405 Жыл бұрын
Всё понятно, но есть важный вопрос! Если нам нужно не просто запустить метод Attack(), но и передать в него какие-то параметры при запуске. Для пистолета - 1 параметр, для вантуза - 2 параметра, а для веника - никаких параметров передаваться не нужно. То как реализовать такое? Ведь это должно указываться непосредственно в классах оружия, а не в самом интерфейсе. Но в таком случае запустить эти методы не получится, т.к. в самом интерфейсе их не будет, к тому же сигнатуры этих методов будут отличаться от сигнатур интерфейса. В общем, это работать не будет. Можно, конечно, указать в интерфейсе все необходимые сигнатуры методов. Но тогда все этих сигнатуры будет нужно реализовать во всех классах оружия. А нам для каждого класса нужен только один метод атаки, но просто принимающий определённые параметры. Надеюсь, мои рассуждения не слишком запутаны. Т.е. вопрос по сути такой: что делать, если нам нужно, чтобы для метода Attack() у каждого оружия была разная сигнатура (принимаемые аргументы)? Заранее благодарю за ответ!
@bamblebi1773
@bamblebi1773 Жыл бұрын
Ты можешь добавить эти параметры в класс конкретного оружия и уже в методе атака делать то, что тебе нужно.
@aleksey8405
@aleksey8405 Жыл бұрын
@@bamblebi1773 А как мне ПЕРЕДАТЬ в этот класс параметры? Если у разных классов - разные параметры. Перечитайте ещё раз то, о чём я спросил в комментарии, на который вы ответили. Суть именно в передаче аргументов. Если у вас есть ответ на этот вопрос - буду признателен.
@bamblebi1773
@bamblebi1773 Жыл бұрын
@@aleksey8405 У разного оружия могут быть разные параметры/настройки, поэтому при описании класса с конкретным оружием необходимо добавить поля для этих параметров. Дальше в конструкторе передавать эти параметры при создании экземпляра конкретного оружия, либо через свойства. Далее, в методе Attack конкретного оружия, вы можете использовать эти параметры.
@aleksey8405
@aleksey8405 Жыл бұрын
​@@bamblebi1773 Использовать свойства? Нельзя обратиться через тип данных интерфейса к свойствам, которые не указаны в самом интерфейсе. Метод Attack может быть разным для каждого класса, но его сигнатура - должна быть одинаковой для всех. Вы не можете для одного из классов сделать сигнатуру, принимающую, например int и string. А для другого - только int. А для третьего - вообще ничего не принимающую. Этот метод должен быть одинаковым для всех, иначе код не скомпилируется. Это принцип работы интерфейсов. И программа ничего не знает о тех параметрах, которые вы добавили дополнительно в какой-то из классов. Потому что они не указаны в интерфейсе. Вы не сможете обратиться к ним через тип данных интерфейса. Вы не можете передать никаких аргументов, уникальных для каждого класса. Только общие, заданные в интерфейсе. И здесь нужно либо использовать привидение типов, например. Но это плохая практика. Понимаете, о чём я?
@bamblebi1773
@bamblebi1773 Жыл бұрын
@@aleksey8405 Извините, я неправильно написал где использовать эти параметры. Не в методе Attack, а в методе Shoot конкретного оружия. А при создании оружия, создавать его с необходимыми параметрами. Таким образом, каждое оружие будет обладать своими параметрами, и исходя из этих параметров будет реализован метод Shoot.
@thewebsapiens
@thewebsapiens 2 жыл бұрын
В теории все понятно. Но на практике - полнейший туман. Раз уж упоминаются игры, то вспоминается Unity. Но какие там могут быть new при объединении интерфейсов вместе с MonoBehavior?.. Да никаких. Получается, что все эти дополнительные сущности - обычные костыли к MonoBehavior и префабам. Ничего они не упрощают по большому счету. Но в консоли красиво смотрится )
@codaza-channel
@codaza-channel 2 жыл бұрын
К сожалению, я не работаю с Unity, поэтому не смогу прокомментировать этот момент. Однако не списывайте паттерн Strategy со счетов, так как это не паттерн плохой, а скорее мне не удалось донести до вас его суть в понятном для вас ключе. Могу лишь добавить, что с точки зрения backend разработки, этот паттерн является одним из часто используемых, так как позволяет расширять логику классов без их модификации. Даже, с точки зрения десктопных приложений (например, Photoshop), как добавить какой-нибудь плагин? Плагину нужно реализовать интерфейс и далее его можно добавить в основную логику программы. Попытайтесь почитать альтернативные источники на тему данного паттерна, так как конкретно этот ролик не раскрыл для вас суть вопроса.
@Gorynysh_98
@Gorynysh_98 Жыл бұрын
Не совсем понятно в чем заключается инкапсуляция алгоритмов если вы создаете их в Main
@codaza-channel
@codaza-channel Жыл бұрын
Так или иначе, стратегии где-то и кем-то должны быть созданы. Если говорить очень коротко, то фишка Strategy в том, что мы можем добавлять новые стратегии не меняя код класса Hero.
@xinitru
@xinitru 2 жыл бұрын
А в чем различие между Strategy и Dependency Injection?
@phat80
@phat80 2 жыл бұрын
DI - это не паттерн, а определенный прием ООП. И как раз этот прием может применяться уже в паттернах и не в одном.
@xinitru
@xinitru 2 жыл бұрын
@@phat80 а разве паттерн - это не есть определенный прием программирования?
@phat80
@phat80 2 жыл бұрын
@@xinitru в моем понимании, паттерн - это комбинация из нескольких приемов. Может я не прав, не претендую на истину в последней инстанции. Ну по сути любой паттерн - это набор простейших понятий и приемов. Такие легкие понятия, как наследование, агрегирование, композиция и т.д., объединяются в какую-то более сложную схему, которая и называется паттерном.
@xinitru
@xinitru 2 жыл бұрын
@@phat80 Ну Интернет с Вами не согласен: Design patterns are typical solutions to commonly occurring problems in software design. И Dependency Injection практически везде называют паттерном. На самом деле, я нашел ответ о различиях. Стратегия применяется для случаев, когда классу необходимо определить разнообразные меняющиеся на протяжении его жизненного цикла действия. А Внедрение Зависимостей обычно применяется для однократного определения реализации поведения в начале жизненного цикла объекта, не меняющегося до его уничтожения. Например, в видео, Сквидвард то вантузом атакует, то бумерангом, то еще чем-то. При использовании Внедрения Зависимостей, мы бы еще в начале жизни задали ему конкретный способ атаки, и дальше он бы атаковал только так.
@phat80
@phat80 2 жыл бұрын
@@xinitru ну не согласен, так не согласен. Такое впечатление, что вы задали кому-то вопрос именно с целью написать, что интернет с этим кем-то не согласен 😂 Доказывать свою правоту не буду, так как не имею на это право, ибо сам в ООП имею только какие-то базовые знания и вероятно неправильные, как выясняется.
@vladrz2525
@vladrz2525 Жыл бұрын
Обязательно ли использовать интерфейс? Можно ведь использовать абстрактный класс вместо интерфейса в котором будет своя какая-то реализация: abstract class Weapon { public abstract string WeaponName { get; } public abstract int Damage { get; } public void Shoot(string nickname) { Console.WriteLine($"{nickname} атаковал используя {WeaponName} и нанёс {Damage} DMG!"); } } class Bow : Weapon { public override string WeaponName => "Лук"; public override int Damage => 12; } // Действия в классе Hero точно такие же как в видео, просто меняем IWeapon на мой класс Weapon Будет ли это реализацией стратегии? Если честно мне кажется, что я не до конца понимаю когда надо использовать интерфейс, а когда абстр. класс. Заранее спасибо большое за ответ! Надеюсь понятно объяснил свой вопрос
@dronsan-unity7302
@dronsan-unity7302 Жыл бұрын
Как то принято через интерфейсы все паттерны делать, но абстрактный класс так же можно использовать - что абстрактный класс, что интерфейс являются абстракцией, на базе чего и строится смысл паттерна
@vladrz2525
@vladrz2525 Жыл бұрын
@@dronsan-unity7302 я уже разобрался, но спасибо за ответ)
@dronsan-unity7302
@dronsan-unity7302 Жыл бұрын
@@vladrz2525 да не за что)
@maksimsazanovich6087
@maksimsazanovich6087 Жыл бұрын
а не лучше было бы реализовать абстрактный класс оружия?
@user-zp7yf7rr9d
@user-zp7yf7rr9d 11 ай бұрын
Можно. Но логически и эстетически, в примере, правильнее будет интерфейс.
@simonsays142
@simonsays142 2 жыл бұрын
объяснение хорошее, но звук маркера ппц как раздражает.
@Bont1860
@Bont1860 Жыл бұрын
звук 12 40 пропал.... ну как так то?
C# Delegates Делегаты
18:14
codaza
Рет қаралды 83 М.
버블티로 체감되는 요즘 물가
00:16
진영민yeongmin
Рет қаралды 116 МЛН
Дибала против вратаря Легенды
00:33
Mr. Oleynik
Рет қаралды 5 МЛН
HOW DID HE WIN? 😱
00:33
Topper Guild
Рет қаралды 40 МЛН
C# QuickSort Быстрая сортировка
21:32
codaza
Рет қаралды 29 М.
Change Behaviors with the Strategy Pattern - Unity and C#
8:07
One Wheel Studio
Рет қаралды 39 М.
Паттерн State, паттерн состояние, Unity C#
13:15
Sergey Kazantsev
Рет қаралды 3,3 М.
C# List
11:35
codaza
Рет қаралды 44 М.
Избавляемся от If и Switch в коде на C#! КАК !?
14:38
Роман Сакутин
Рет қаралды 96 М.
Zenject, внедрение зависимостей, Unity C#
15:03
Sergey Kazantsev
Рет қаралды 5 М.