Kotlin Code Reuse: Composing like you're Inheriting

Поделиться
HTML-код
  • Опубликовано: 28 янв 2025

Комментарии • 48

  • @codingCouncil
    @codingCouncil 6 месяцев назад +21

    Dave I love your videos and out of the millions out there , your way of explaining things stands out .
    Please keep them coming

    • @typealias
      @typealias  6 месяцев назад

      That's very kind of you to say - thank you so much! I'll keep at it!

  • @QuantuMGriD
    @QuantuMGriD 6 месяцев назад +15

    At last! patterns starting to emerge in the channel. Thank you so much! 😊

    • @typealias
      @typealias  6 месяцев назад +3

      Hey, you're most welcome! I'm glad you mentioned it last time - there were enough likes on those comments that I couldn't ignore it! 😁

    • @QuantuMGriD
      @QuantuMGriD 6 месяцев назад

      😊❤

  • @robchr
    @robchr 6 месяцев назад +9

    Go lang is statically typed and it does allow for implicit interfaces. It''s because Kotlin is statically typed using a nominative type system. This is why it why you need to explicitly specify the relation.

    • @typealias
      @typealias  6 месяцев назад +5

      Thanks Robert - that's a great clarification... it's not just the static typing. TIL Go is structurally typed! Might have to play with that at some point 👍

    • @brunojcm
      @brunojcm 6 месяцев назад +2

      Go and Typescript are both structurally typed and Kotlin uses a nominal type system, but all of them are statically typed. This is something people rarely talk about, maybe a video about it would be nice!

  • @MoamenHraden
    @MoamenHraden 6 месяцев назад

    Thanks

    • @typealias
      @typealias  6 месяцев назад

      Hey Moamen! Man, thank you so much for the SuperThanks! I'm excited about growing the channel and the community - and your support is a big encouragement!

  • @TheBloodshotVN
    @TheBloodshotVN 3 месяца назад

    Dave, just want you to know I love your content and I actually following these to catch up with new Kotlin & Android knowledge, please keep up the good work.

    • @typealias
      @typealias  3 месяца назад

      Hey, thanks so much, Nhat Tan - I appreciate your kind words! I'll keep at it!

  • @serrrsch
    @serrrsch 6 месяцев назад +4

    I gotta say I'm kinda jealous of the newcomers who are getting into programming / computer science today.
    Only ten years ago this quality in a lesson was not available to me on YT or similar platforms ~FOR FREE~.
    Big up for the outstanding video!

    • @typealias
      @typealias  6 месяцев назад +2

      Yes, it's quite a different world, for sure! I'm honored (and encouraged!) that you found this lesson to be of that level of quality!

  • @gb_kash
    @gb_kash 2 месяца назад

    Thanks Dave! Your Kotlin content is Gold.

    • @typealias
      @typealias  2 месяца назад

      Thanks so much, GB! I'm glad you're enjoying it! 🎉

  • @ErikBongers
    @ErikBongers 6 месяцев назад +1

    Pros and cons over dogmatics, thank you!
    The 'by' keyword in Kotlin is indeed one of their great syntax sugars.

  • @alanmeanam
    @alanmeanam 6 месяцев назад

    This is the best explanation to this principle I have ever seen, thanks!!!

  • @EugeneGalonsky
    @EugeneGalonsky 6 месяцев назад +2

    There's a mistake in Chapter 13 in the Waiter's UML box:
    Waiter+
    + prepareEntree(name: Entree): Entree?
    Should be:
    + prepareEntree(name: String): Entree?

    • @typealias
      @typealias  6 месяцев назад +1

      Thanks, Eugene! I'll get that fixed up. 👍

  • @BewareOfStinger
    @BewareOfStinger 6 месяцев назад

    Thank you, Dave! Superb video as always. Keep them coming! :)

  • @pablovaldes6022
    @pablovaldes6022 6 месяцев назад +1

    So for proxy classes or to implement the proxy object pattern I can't use the class delegation, one has to manually forward every function call to whatever is the current proxy implementation. 😢

  • @guyguy467
    @guyguy467 6 месяцев назад +2

    Very nice explanation. Thank you

  • @RomanDawydkin
    @RomanDawydkin 2 месяца назад

    So, with *this* kind of composition, we have one vehicle inside another vehicle?

  • @harsh3305
    @harsh3305 6 месяцев назад

    Crispy clean explanation

  • @vyrus507
    @vyrus507 6 месяцев назад

    Just bought the book, was gonna get it eventually but this one sold me, great vid!

    • @typealias
      @typealias  6 месяцев назад +1

      Hey, thank you so much! I hope you enjoy the book! 🙂

  • @aungkhanthtoo7678
    @aungkhanthtoo7678 5 месяцев назад

    Dave, may I know the name of font you used?

    • @typealias
      @typealias  5 месяцев назад

      Hello! Are you referring to the font on the thumbnail image? If so, it's called Luckiest Guy: fonts.google.com/specimen/Luckiest+Guy

    • @aungkhanthtoo7678
      @aungkhanthtoo7678 5 месяцев назад

      @@typealias Sorry, I meant font using in the IDE.

    • @typealias
      @typealias  5 месяцев назад +1

      Ah, yes - that's using JetBrains Mono: www.jetbrains.com/lp/mono/

  • @osisuper98
    @osisuper98 6 месяцев назад

    No one explains anything better than Dave, omg.

  • @wagnerarcieri
    @wagnerarcieri 6 месяцев назад +1

    if Junker has 'makeEngineSound() = Unit', why it printed "Vroom! Vroom!" ? while 'accelerate() = Unit' returned speed as 0.0

    • @typealias
      @typealias  6 месяцев назад +2

      In the example at 9:05, it's important to note that raceCar2 isn't a Junker; it's a RaceCar that wraps a Junker (line 36). It delegates speed and accelerate() to the Junker (lines 27-28), but it provides its own implementation of makeEngineSound() (line 29). This is roughly the same idea as if RaceCar were to inherit from Junker and override only makeEngineSound().

    • @wagnerarcieri
      @wagnerarcieri 6 месяцев назад

      @@typealias Oh! I get it now! Thanks for your kindness to explain!

    • @typealias
      @typealias  6 месяцев назад +2

      🎉 That's great! Happy to do so!

  • @ulicqueldromal
    @ulicqueldromal 6 месяцев назад +1

    About the ackwardness of IVehicle and Vehicle. It's pretty obvious here why this naming is suboptimal. All of the cars are Vehicles. Yet the thing called Vehicle is just one example of a vehicle. Why is that one called a Vehicle but not the others?
    The interface should be called Vehicle and this Base subclass should get a name fitting your domain. Since this is just an example you might end up with a name like BaseVehicle but in a well defined domain this would have a better name.

    • @mwatkins0590
      @mwatkins0590 5 месяцев назад

      why not just call the interface Drivable, since thats the point of it?

  • @mohammad-rezaei2018
    @mohammad-rezaei2018 6 месяцев назад

    As always excellent

    • @typealias
      @typealias  6 месяцев назад +1

      Thanks so much, Mohammad!

  • @westforduk
    @westforduk 6 месяцев назад

    Great as usual. Thanks Dave :)

    • @typealias
      @typealias  6 месяцев назад

      Thanks so much!

  • @Kubkochan
    @Kubkochan 6 месяцев назад +5

    It would be much nicer to have engine in composition. This kind of composition looks too unnatural

    • @ArthurKhazbs
      @ArthurKhazbs 6 месяцев назад

      Yes! I wanted to write that comment too.

    • @typealias
      @typealias  6 месяцев назад +3

      Hey, thanks for commenting! Yes, it can look unnatural - mostly because it's easiest for us to map our notions of real-world object relationships onto software models - for example, RaceCar "is a" Vehicle, and Vehicle "has a(n)" engine. Many of us learned that kind of mapping early on, and plenty of successful software systems have been largely designed around it. It's helpful because one of the most important characteristics of code is for a human to readily understand it.
      That shouldn't be our only lens, though. There are additional characteristics (flexibility, performance, scalability, security, etc.) that we should consider, and to understand those, we have to ask what it is that we gain or lose by constructing the relationships one way compared to another (e.g., inheritance vs. composition, recursion vs. iteration, and so on). That's what I hoped to achieve in this video - to demonstrate that inheritance can also be expressed with object composition or class delegation, and to consider the trade-offs involved with each approach.

  • @j2shoes288
    @j2shoes288 6 месяцев назад

    we in 1990s?

  • @hamuelagulto796
    @hamuelagulto796 4 месяца назад

    I