Design Patterns: Liskov Substitution Principle Explained Practically in C# (The L in SOLID)

Поділитися
Вставка
  • Опубліковано 22 лип 2024
  • When you are writing code, are you doing it right? That is a question that worries a lot of people, and it should probably at least be something every developer thinks through. Design patterns are best-practice concepts that we can implement into our code to make it better in some way. Think of them as guardrails that keep our code safe. In this video, we are going to look at the third entry in the famous SOLID principle. The L stands for the Liskov Substitution Principle. We are going to dive into what it means, how it should change our programming practices, and how far we should take it.
    Newsletter signup (with exclusive discounts): signup.iamtimcorey.com/ (your email will be kept safe and you will not be spammed).
    Source Code: leadmagnets.app/?Resource=LIn...
    0:00 - Intro
    1:32 - Demo code overview
    3:04 - Liskov Substitution Principle: LSP Explained...
    6:15 - Side note: Covariance and Contravariance, Preconditions Postconditions
    10:17 - ...LSP Explained
    13:58 - Considering the Open and close principle
    17:24 - Implementing LSP: Refactoring demo code
    29:23 - Note on abstraction in base classes
    33:02 - Flexibility with LSP and Concluding remarks

КОМЕНТАРІ • 496

  • @ethanvenencia5653
    @ethanvenencia5653 3 роки тому +19

    3 years old but still quality content. Cheers man!

  • @RalfsBalodis
    @RalfsBalodis 3 роки тому +17

    0:00 - Intro
    1:32 - Demo code overview
    3:04 - Liskov Substitution Principle: LSP Explained...
    6:15 - Side note: Covariance and Contravariance, Preconditions Postconditions
    10:17 - ...LSP Explained
    13:58 - Considering the Open and close principle
    17:24 - Implementing LSP: Refactoring demo code
    29:23 - Note on abstraction in base classes
    33:02 - Flexibility with LSP and Concluding remarks

  • @vero7427
    @vero7427 Рік тому +4

    After going through multiple resources these are by far the best SOLID Principle explanations I've come across so far. I have a much better understanding now :)

  • @pranaygawand4884
    @pranaygawand4884 5 років тому +10

    Awesome work again Tim! Never understood LSP event after spending hours on the internet reading blogs and articles. Thank you so much!

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      I'm glad this was helpful to you.

  • @deltacap0192
    @deltacap0192 2 роки тому +3

    Fortunately landed here for an interview purpose.
    Just 13 minutes into the video and now I will never be able to forget it.
    No more brush-ups before the interview. It will be a part of my daily routine now.
    I have always used preconditions, type checks, typecasting, or dummy implementations to escape such scenarios. Never knew that was a violation of this textbook rule.
    I had tried explanations with practical examples earlier too, but the simplicity of example and language in your video beats all of them.
    Thank you so much...

    • @IAmTimCorey
      @IAmTimCorey  2 роки тому +2

      I am glad it was so helpful.

  • @shenamariedabalos1699
    @shenamariedabalos1699 2 роки тому +5

    I try not to skip the ads as a thank you for your amazing content. Thank you.

  • @mitchellbroue4778
    @mitchellbroue4778 4 роки тому +6

    Great video. This is the first presentation that has enough clear explanation to solidify the LSP principles. Full marks.

  • @priyankapardesiramachander871
    @priyankapardesiramachander871 4 роки тому +4

    I am addicted to your teaching style. Reading these design concepts from books is one thing, but a code example really opens up one's mind for better understanding.
    Thank you for all the tutorials, and special thanks for making the source code available.

    • @IAmTimCorey
      @IAmTimCorey  4 роки тому +1

      You are most welcome. Thanks for watching.

  • @sebainones
    @sebainones 2 роки тому +2

    One of the best explanations I've ever found on this pricniple that sometimes it could be tricky or confusing. Thanks a lot!

  • @xcyron
    @xcyron 2 роки тому +3

    Learned so much in these 3 courses so far, this is seriously the best tutorial on SOLID that i came across.

  • @iandalrymple7255
    @iandalrymple7255 2 роки тому +3

    This might sound weird but I must say I regret not watching all of Tim Corey C# videos from the start of my programming journey. Would have saved me a lot of time. Thank you sir for the work you have done.

    • @IAmTimCorey
      @IAmTimCorey  2 роки тому +3

      I appreciate the kind words. I am glad you have found my content so valuable.

  • @mattak77
    @mattak77 3 роки тому +10

    This is by far the best and cleanest explanation with hands on coding. Also some tips for Visual Studio shortcuts, brief explanation for abstract class helped me learn more than SOLID principle. Thank you so much.

  • @hayleyha9433
    @hayleyha9433 3 роки тому +3

    This is the best explanation on the internet for SOLID. Thank you for making separate videos with code demo for each topic, they are extremely helpful and after watching your seri on this topic, I don't feel vague a bout SOLID anymore

  • @kmorgan26
    @kmorgan26 5 років тому +2

    Great stuff, Tim! I have read about inheritance several times before, and now that I've watched this video, I think I have a waaaay better understanding of how to implement it. You have a great way of explaining rather complex concepts! Good on you.

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      Awesome! I'm glad it was so helpful.

  • @myemailvl
    @myemailvl 5 років тому +3

    Thank you, Tim! You have a talent to explain everything in a simple way. I appreciate your work very much! Thank's again!;)

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      You are most welcome. Thanks for watching.

  • @n9434178
    @n9434178 6 років тому +1

    Thank you Tim ! Very clear and very useful explanation to me. It really is a very complete answer to the question that I posted in response to your OCP video. Looking forward to your next videos!

  • @LarryPeteet
    @LarryPeteet 3 роки тому +2

    Thanks Mr Corey. You are a Rockstar. I have been with Microsoft Technology Stack for 25 Years (MSDOS, Microsoft C) and keep trying to learn some of the things you know so well!!

  • @shacham85
    @shacham85 6 років тому

    Thank you for this. This is by far the best explanation of Liskovs principle I have seen yet.

    • @IAmTimCorey
      @IAmTimCorey  6 років тому

      I am glad you found it valuable.

  • @dejamirgianelli6231
    @dejamirgianelli6231 4 роки тому +2

    One of the best explanations I've seen at UA-cam.

  • @bobcat235
    @bobcat235 4 роки тому +8

    Tim Corey, you are a gift from God for explaining this stuff. Thankyou!

    • @IAmTimCorey
      @IAmTimCorey  4 роки тому +1

      You are welcome.

    • @fisheralaric692
      @fisheralaric692 2 роки тому

      I dont mean to be so off topic but does any of you know a trick to log back into an instagram account??
      I was stupid lost my account password. I would appreciate any assistance you can offer me

    • @alonsobentley3351
      @alonsobentley3351 2 роки тому

      @Fisher Alaric instablaster =)

    • @fisheralaric692
      @fisheralaric692 2 роки тому

      @Alonso Bentley I really appreciate your reply. I got to the site thru google and I'm waiting for the hacking stuff atm.
      I see it takes quite some time so I will get back to you later with my results.

    • @fisheralaric692
      @fisheralaric692 2 роки тому

      @Alonso Bentley it worked and I now got access to my account again. Im so happy!
      Thanks so much, you saved my account!

  • @jesphaylobo8105
    @jesphaylobo8105 3 роки тому +2

    That was a super example and a great explanation about interfaces. I now feel comfortable with interfaces.

  • @NeoPlanetx
    @NeoPlanetx 6 років тому +1

    Great material Tim, keep up to good work! Thank's for helping the community with your knowledgment!

    • @IAmTimCorey
      @IAmTimCorey  6 років тому

      I appreciate the kind words.

  • @sbeasley1120
    @sbeasley1120 5 років тому

    I like making anything that uses Base in the class name abstract. Because it shouldn’t ever be used on its own. I’m glad that you talked through it here.

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      Yep, that's a good convention.

  • @callumhaynes1384
    @callumhaynes1384 3 роки тому

    Best explanation i have seen, thanks for jumping straight to the code. I have always struggled to understand this principle, but now i understand it. Cheers Tim :)

  • @pradeepbetty
    @pradeepbetty 2 роки тому +1

    Thank goodness,.. At last, a more practical example than the rest of the internet,... Thank you TIM.

  • @niyaziozturk3967
    @niyaziozturk3967 4 роки тому

    Thank you Tim. I studied this four five years ago and totally forgotton. Very good tutorial, thank you!

  • @pw.70
    @pw.70 4 роки тому

    I found this more intuitive than the Open/Closed Principle. Excellent tutorial - thank you.

  • @Neo8019
    @Neo8019 4 роки тому +2

    Great tutorial, thanks! You create one of the best ones out there. Keep up the great work.

  • @gerardhayden6568
    @gerardhayden6568 Рік тому +3

    Tim, your Car/Deckchair analogy reminded me of an old Jeremy Clarkson clip, where he was detailing what makes a supercar, when he said something like "Of course, not everything painted bright red with the engine centrally mounted behind the driver is a supercar" and the camera pans back to revel him standing by a ride-on lawn mower!

  • @bagratzakaryan8871
    @bagratzakaryan8871 Рік тому +1

    Frankly speaking, I read up to 10 articles about LSP and watched multiple videos, and I couldn't really understand the principle of LSP, but your video is perfect, even I do not know C# language, but I know Typescript thought it would be difficult to understand, but not, it's helped me thanks a lot for the explanation.

    • @IAmTimCorey
      @IAmTimCorey  Рік тому +1

      Awesome! I’m glad it was helpful.

  • @maricelpurusniuc7038
    @maricelpurusniuc7038 2 роки тому +1

    Great series, with just the right amount of technical details and explanations

  • @Reaper7mk
    @Reaper7mk 2 роки тому +1

    What a practical and beautifully sophisticated example. Bravo sir.

  • @stephenyork7318
    @stephenyork7318 4 роки тому +1

    Around 9:00, something I've never considered! Love your work, thanks heaps.

  • @RaterisimoCBA
    @RaterisimoCBA 2 роки тому +1

    Another excellent class. I'll be taking one of your courses soon, I can see myself learning this way. Thank you for having this content for everyone, it's so helpful !

  • @alex44483
    @alex44483 6 років тому +1

    Really enjoying this series, thanks for making it :) You explain things a lot clearer than others

    • @IAmTimCorey
      @IAmTimCorey  6 років тому

      I'm glad you are enjoying it.

  • @Dame4Lyf3
    @Dame4Lyf3 6 років тому +1

    Great series and have been invaluable to becoming a better programmer, thanks for your time in explaining these concepts to a fledging developer.

    • @IAmTimCorey
      @IAmTimCorey  6 років тому

      I'm happy that it has helped you develop as a programmer. That's why I make these videos.

  • @timmyers9798
    @timmyers9798 5 років тому +2

    LOL, "Whatever you do, don't freak out" ... loved that comment. Great video. Thanks man.

  • @Redpill99
    @Redpill99 Рік тому +4

    Thank you Tim for all the free content.

  • @jasonk.3595
    @jasonk.3595 6 років тому

    Thank you Tim, your videos are excellent. This video in particular helped me a lot. Much appreciated. Cheers!

  • @amnesia3490
    @amnesia3490 3 роки тому +1

    It was awesome explanation of Interface, Inheritence and other all that related stuff. Its not only explanation of princple it is also perfect example of understanding inheritence.

    • @IAmTimCorey
      @IAmTimCorey  3 роки тому +1

      Thank you, that is the goal.

  • @harag9
    @harag9 Рік тому +2

    Great explanation and very clear, many thanks Tim. Not sure why I've not seen this video when I've seen your other SOLID videos. hmm.

  • @SuperBbbbssss
    @SuperBbbbssss 6 років тому +1

    I have all the 5 SOLID principles - thanks for your effort brother.

  • @Oleg-ng7ss
    @Oleg-ng7ss 3 роки тому

    Thanks! Good explanation. Very helpful for me. Now I understand what is LSP.

  • @thomascaedere
    @thomascaedere 5 років тому +2

    Hey Tim, I really like the use cases you used for illustrating these problems. I'm encouraging all of my team members to have a look at this series about SOLID to make sure they are doing the right thing.
    One thing though, I would use the IManager input type for AssignManager method in stead of IEmployee and make the Manager property in IManaged of type IManager.
    This way, you're making sure we can only input a manager when assigning the manager.
    When retrieving the manager from the employee, we are certain the manager can in fact generate a performance review, which would make this implementation more safe i.m.o.
    It doesn't break anything about the fact that this video is very well explained. Thank you!

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      I'd have to go back and watch, but this sounds like a reasonable suggestion. Thanks!

  • @nikolaykolev5431
    @nikolaykolev5431 6 років тому +2

    Hey Tim, great content, please keep up the good work, looking forward :)

  • @georginakissinger3492
    @georginakissinger3492 3 роки тому

    Best explanation ever. Thank you Tim Corey.

  • @aimanalnami7655
    @aimanalnami7655 2 роки тому +7

    Thanks tim this is real world scenario ... better then shape and rectangle 😂

  • @solr4cc
    @solr4cc Рік тому +2

    Finally very good explanation of LSP. Great content!

  • @tanmayrao6673
    @tanmayrao6673 4 роки тому +2

    Thanks tim, this helps me a lot.
    Awesome bro!!!

  • @ashishdawale4790
    @ashishdawale4790 5 років тому +1

    Very well explained. Thank you Tim!

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      You are most welcome. Thanks for watching.

  • @rasikagayangunarathna
    @rasikagayangunarathna 4 роки тому +2

    Thank you very much for this valuable tutorial.

  • @RobertMunteanu105
    @RobertMunteanu105 2 роки тому +2

    Hey Tim, thanks a lot for this video!
    I was having a quick look on things. I'm having an interview tomorrow 😄

  • @paulofernandoee
    @paulofernandoee 2 роки тому +3

    Great Series Tim! It's really nice to see the principles blending in and complementing each other.
    If someday you have the time to make a video about covariance and contravariance, i believe you will be able to explain it in an excellent way, i have tried reading the msdn docs and watching other videos on this matter, i just cant understand it.

    • @IAmTimCorey
      @IAmTimCorey  2 роки тому +2

      Thanks for the suggestion. Please add it to the list on the suggestion site so others can vote on it as well: suggestions.iamtimcorey.com/

  • @torrvic1156
    @torrvic1156 Рік тому

    Thank you so much for excellent explanation of a very complicated matter Tim! This is really helpful and useful in the real life applications. I though I will never understand it properly. But it seems like I am starting to figure it out after you video. In global it is all about keeping wise balance between inheritance and interfaces. All of the three types of employees should have everything common in their base class and differences should be shown via interfaces. That is how I understood it.

  • @xcyron
    @xcyron 2 роки тому

    When i finished the second video (O in Solid) i was like, wait, how do i acces additional methods and properties that aren't part of the interface now? And here we are at the solution for that.
    Amazing tutorial series.

  • @zulhishamtan4308
    @zulhishamtan4308 3 роки тому +2

    This is really good.
    Thank you very much.

  • @lesmonkmorison2828
    @lesmonkmorison2828 2 роки тому +1

    another great video Tim, thanks much.

  • @soucianceeqdamrashti8175
    @soucianceeqdamrashti8175 4 роки тому

    Really well explained with good examples!

  • @mimart3011
    @mimart3011 2 роки тому

    11:40 I like you mentioned one of the ways how to overcome this. One is have interfaces instead or you can/should/have to write tests to cover the cases where the LSP can be broken

  • @19gauravmittal91
    @19gauravmittal91 4 роки тому

    Thanks Tim. you made it so simple.

  • @canpehlivan5090
    @canpehlivan5090 5 місяців тому

    Hey Tim! Thanks for the video, man!

  • @MrDanieldamianov
    @MrDanieldamianov 4 роки тому +2

    Helpful as always

  • @nagamanikanta4251
    @nagamanikanta4251 3 роки тому

    Thanks for the videos. It was a good explanation with a real-world example. could you please make one video applying the solid principles in a simple project?.

  • @GuRuGeorge03
    @GuRuGeorge03 2 роки тому

    It really clicked when you said that CEO is not an employee. It immediately gave me the idea that a manager should be any class that implements an IManager interface that can then be dependency injected into any class that has a manager. In other words, getting rid of inheritance is just great, lol

  • @sherifmankarious88
    @sherifmankarious88 3 роки тому

    This is awesome, thanks Tim!

  • @avitwito1734
    @avitwito1734 5 років тому +1

    Great tutorial. love your channel

  • @filip4092
    @filip4092 3 роки тому +2

    Perfect explanation thanks a lot.

    • @tomthelestaff-iamtimcorey7597
      @tomthelestaff-iamtimcorey7597 3 роки тому +1

      We are glad you found it helpful and appreciate your sharing your thoughts. Thanks for being a part of this great community.

  • @djangounchained7314
    @djangounchained7314 4 роки тому +1

    Excellent Tutorial!! thanks a looooooooot!!

  • @vinuhosanagar1
    @vinuhosanagar1 6 років тому

    Best explanation ever. Thank you

    • @IAmTimCorey
      @IAmTimCorey  6 років тому +1

      I'm glad it came through clearly. It can be a tricky one.

  • @RoyWagemakers
    @RoyWagemakers Рік тому +1

    Great video. Easy to follow

  • @olliegelton5976
    @olliegelton5976 Рік тому +1

    very nice.. thank you Tim

  • @HawkEyeExplorers
    @HawkEyeExplorers 2 роки тому +1

    Great explanation. Thank you

  • @hugogogo13
    @hugogogo13 Рік тому +2

    LSP could be summed up as ALP => "Avoid Lazy Polymorphism".
    Thank you for your videos Tim!

  • @tsachigal1744
    @tsachigal1744 Рік тому +1

    Best explanation. Thank you

  • @vartikagupta8816
    @vartikagupta8816 3 роки тому +4

    How do you find the easiest way to explain things. I think I have understood it for good this time. Thanks Tim!

  • @VijayendraDGhatge
    @VijayendraDGhatge 4 роки тому

    Great explanation, cleared everthing

  • @AlmirVuk
    @AlmirVuk 6 років тому

    Thank you for these videos!

  • @araksabramovic6156
    @araksabramovic6156 Рік тому +2

    This video gave me an offer) Thank you bro

  • @TheAngelOfDeath01
    @TheAngelOfDeath01 6 років тому +1

    "Learning" this in C++ back in my ooolld science class was a freaking nightmare, especially because of the ability to perform inheritance from MULTIPLE classes, etc. Glad to see you decided to include those abstract classes. ;-) hehe. Thanks for uploading; as always a good and informative video! :D

    • @IAmTimCorey
      @IAmTimCorey  6 років тому +1

      Multi-inheritance can be ... challenging. Glad you enjoyed the video.

    • @TheAngelOfDeath01
      @TheAngelOfDeath01 6 років тому

      IAmTimCorey meaning you write C++ or JAVA yourself??

    • @IAmTimCorey
      @IAmTimCorey  6 років тому +1

      Yep. I haven't in a couple years but I've been a consultant off and on for years. In that time I've developed applications in FoxPro, Access, VBA, VB6, C, C++, Java, JavaScript, PowerShell, ObjectiveC, Python, PHP, VB.NET, and Delphi to name a few. At one point I stopped counting at 20+ languages that I had built applications in. I try to focus on C#, SQL, and JavaScript these days as much as I can though.

    • @TheAngelOfDeath01
      @TheAngelOfDeath01 6 років тому

      Whistles. I stuck with VBscript, PHP, JavaScript and a tiny-tiny amount of C++ (just enough to understand the concepts) PHP I'm good at, especially combined with Zend-Framework and MySQL, and the pivotal HTML, JavaScript and CSS combinations.

    • @IAmTimCorey
      @IAmTimCorey  6 років тому +1

      The trick is to realize that all languages fall roughly into two buckets: functional and object oriented. Once you are comfortable with how one of the buckets work, the differences between languages in that bucket are just syntax. The logic stays the same. So basically, you can think in C# (the concepts) but write in C++ or Java by just figuring out how to do x in the other language. It isn't as efficient (you Google a LOT) but you pick it up pretty quick.

  • @dennohnjogu4028
    @dennohnjogu4028 8 місяців тому

    what if you overloaded the AssignManager() inside the Employee base class to have a version similar to what the CEO had 5:10 line 18? would you be compliant?

  • @ruifeng4901
    @ruifeng4901 3 роки тому +2

    Thank you Tim! Your video is very thought-provoking! After watching this video. As to the example you mentioned in the end about both cars and desks have wheels doesn't mean they're related enough to have an inheritance structure. It reminds of me the difference between 'is-a' and 'has-a' reslationship. Is it possible that you make some videos to illustrate these two relationships using some examples? Thanks again!

    • @IAmTimCorey
      @IAmTimCorey  3 роки тому +3

      Thanks for the suggestion. I have added it to the list of possible future topics.

  • @catrielportela1885
    @catrielportela1885 5 місяців тому +1

    Hello Tim, great video men!
    I have a quick question,
    What happens if i need in my code to distinguish between different employees type, for example, i want to do something if the employee is Staff and other thing if is Manager. How would i be able to distinguish them apart if not by a employeeType attribute?
    Tell me your opinion!
    Thxxxx

  • @allmhuran
    @allmhuran 6 років тому +1

    Good video. Coming from a relational background, the "correct" solution in my mind is different from the one proposed here.
    Essentially, I'd say this: The manger of an employee is *not* a property of the employee. It is a relationship between two entities. As such, the solution would be to create a new class to model that relationship. We would then keep the set of all of those relationships in an containing entity which we might call the OrganisationalChart.
    That's somewhat specific to this example, but that's because the example involves relationships between entities, and the same sort of model should apply to any similar situation - ie, don't model relationships between entities as attributes of those entities - which is something that comes up quite often.

    • @IAmTimCorey
      @IAmTimCorey  6 років тому +2

      This is how we model that relationship in C# though. When using a class instance as a property, we aren't putting that class into our class (so we aren't putting a Manager into an Employee), we are essentially putting a reference to the other object in our current object (so Employee has a reference to the Manager class, not a copy of it). The classes still exist on their own. In that way, we could actually go up the org chart from any employee all the way to the CEO. We look at the Employee's manager, and then look at that manager's manager, and so on up the chain. I didn't add it but typically I would also include a List that is the subordinates of any Manager.
      If we create another object that is the relationships (the organizational chart), we are storing information about the Employee outside of the Employee class. That means keeping that data connected to the Employee while outside of its control. That is dangerous. It provides a possible synchronization issue if one changes without the other. If you have the Employee link to an OrgChart object, there is not any really difference then between this solution and directly linking to the Manager except you have added a layer of complexity without gaining any perceivable benefit.
      That is why, because of how class instances work, it is best in C# to assign a class instance to the Manager property and put it into the Employee class. Besides, if you were to ask me who my manager is, I would not refer to you an OrgChart. I would just tell you. That is what our application is doing.

    • @allmhuran
      @allmhuran 6 років тому +1

      Yep, I know that's how it's often modelled, for example in the entity framework (which does give the parent a collection of the children as you described). What I'm saying is that I don't think the approach is logically supportable.
      If I make anything a member of a class, then I'm saying that the class is responsible for that member. But the employee represented by the employee class is not responsible for the relationship between itself and its manager, so the manager (or manager reference) shouldn't be a member of the employee class. The same argument applies to the collection of employees (or employee references) in the manager object.
      Creating the org chart doesn't store information about the employee outside of the employee class. All of the properties of employees are still stored in employee objects. What the OrgChart does is store information about the relationships which exist between those employee objects.
      As a "proof by contradiction" of this, consider a company that only has a single employee. This employee has no manager. In fact they can never have a manager given this condition. But the employee can still be fully defined - this is trivially true, because they are in fact an employee. So it is possible to fully define the employee despite the absence of a manager. But if the employee class has a manager reference, and if that reference is null, then the employee has not been fully defined. Ergo, the employee class should not have a member which is a reference to a manager.
      I realise that this is not the way in which models are typically created (eg, in C#), but I'm not appealing to tradition according to any particular language, I'm looking at it from a more fundamental perspective rooted in predicate logic.

  • @paulalwin91
    @paulalwin91 5 років тому

    Thanks for the video! Also, I do not see the option to Extract Interface in my Visual Studio 2017 Community Version, any idea why?

    • @IAmTimCorey
      @IAmTimCorey  5 років тому

      It should be available to you. Maybe you aren't selecting the right location in the code? Here are the docs for it: docs.microsoft.com/en-us/visualstudio/ide/reference/extract-interface?view=vs-2017

  • @khashayarpakkhesal6026
    @khashayarpakkhesal6026 Рік тому

    Greate video thank you so much but a question came to my mind you have managed to remove repeated code by declaring BaseEmployee and separate the responsibility of each class by declaring interfaces but how would you manage to remove repeated code in Manager and CEO (GeneratePerformenceReview) ?

  • @kenjiobara
    @kenjiobara 6 років тому

    Nice vid Tim!!
    What you did is a design pattern or just refactoring to depends on interface over concret type?
    How can i improve my skill to refactoring? Is there any material to help?

    • @IAmTimCorey
      @IAmTimCorey  6 років тому

      The best way to improve your refactoring skills is to practice refactoring. I know it would be nice to have an easier solution than that but practice is the best teacher.

  • @recepcakir4866
    @recepcakir4866 3 роки тому

    Awesome, thanks a lot, Tim!
    Just a question to make my mind clear; what you have done here, is it related to 'composition over inheritance'? I see there is a similarity between them, an answer would be perfect for me to figure it out.

  • @drip888
    @drip888 2 роки тому

    is there any way we can know if the values we give by using equals operator or by arguemnts are pass by value or pass by reference in the entire program ??

    • @khajalieubarrie5088
      @khajalieubarrie5088 2 роки тому

      Dunno if it’s applicable to C# but in Java which is another OOP supported language, all primitive value types (passed as an argument to a method) are always passed by value and all Custom Data Type is passed by Reference. This is because variables for Custom Type holds an address to the Object in the heap not the actual object itself where as a primitive type variable always points to the actual object.Hope this helps.

  • @LarryPeteet
    @LarryPeteet 3 роки тому +3

    Suggestion: "Track Active Item in Solution Explorer" under Tools, Options.
    This would let us watching easily see which file you are in. For example you were talking about Employee and showing Code for Employee but Solution Explorer on the screen was highlighting CEO.cs file.

  • @nandakumar1712
    @nandakumar1712 2 роки тому

    HI Tim, Thanks for those amazing videos on SOLID principles with C#. In Liskov principle after refactoring still we can't do "BaseEmployee emp = new Manager();". Because AssignManager method does not exist here. Could you please explain what is wrong with my understanding?

  • @paulonobrega942
    @paulonobrega942 Рік тому +1

    Hi Tim, thanks a lot for the video. I have a question:
    Instead of creating a new base class and all of the interfaces doesn't this code at CEO Class makes it LSP compliant?
    public override void AssignManager(Employee manager)
    {
    Manager = null;
    }

    • @chrisvarns
      @chrisvarns Рік тому +4

      No because if you had a GetManager() method, it would return null for a CEO and a manager for everyone else, the CEO behaviour breaks from Employee behaviour by silently dropping any Employee that is passed to it.

  • @sulabee9228
    @sulabee9228 3 роки тому +1

    There's something that i don't understand with this principle (sorry , i'm new to this thing)
    what benefit do we get by applying this principle ?
    also at 5:12 if we just delete that line and left the method empty or replace it with Console.Writeline("You can't assign manager to CEO");
    do we achieve LSP?

  • @GG-uz8us
    @GG-uz8us 5 років тому

    What if I leave the AssignManager() empty instead of throwing an exception when override it in the CEO class?

    • @IAmTimCorey
      @IAmTimCorey  5 років тому +3

      Then it would "work" when called and leave your application in an unexpected state (it thinks it assigned a manager but it didn't really).

  • @sometexthere4169
    @sometexthere4169 5 років тому

    Great video! thanks

  • @colin-campbell
    @colin-campbell 6 років тому +3

    Tim Corey for president

    • @IAmTimCorey
      @IAmTimCorey  6 років тому +1

      Ha! There's a job I don't want. I'm happy making developers' lives easier.

  • @Kavorka666
    @Kavorka666 8 місяців тому +1

    Quick Question , if its not too much trouble. Why do we need to add IEmployee interface? Can't we just use BaseEmployee class to inherit from others?

    • @johnikeson3114
      @johnikeson3114 7 місяців тому +2

      You have an IManaged interface which needs to extend to the IEmployee interface. Interface can't extend a concrete class. IManaged : BaseEmployee [x]

  • @andrewjakobs528
    @andrewjakobs528 4 роки тому

    thanx again for the interesting video.

  • @user-qb2py7ko7q
    @user-qb2py7ko7q Місяць тому

    Great video! Thank you

  • @KiranYadavOG
    @KiranYadavOG 10 місяців тому

    Thanks for this!

  • @Mahamad1231
    @Mahamad1231 2 роки тому

    Thanks for the great example and explanation. just one question, what if I want to make the Salary property to be set only with its based classes? so that its cannot be directly set a value. i trued to add protected set modifier to it, but it broke the code

    • @Mahamad1231
      @Mahamad1231 2 роки тому

      ok so i remote the set in the interface for Salary, and in the BaseEmployee added protected set to it implementation , hope I'm correct