I've been reading and digging into the theory in OOP a lot recently and one question always seems to come up for me.
It seems that some of the concepts, such as abstract classes, interfaces, and to a lesser extent visibility, have more to do with situations where other people will be extending your code...
For example, let’s say I was making a simple CRUD application for a small company to store customer information, contact information, orders, etc. The size of the application may warrant an OOP architecture, but I know from the offset that no one else will be extending this code and that it will be a 'closed' project once I've finished it. As such, it seems that setting things up for the future, and creating those sort of protections and contracts -- via abstract classes, interfaces -- may be overkill? Does that seem accurate?
All that being said, I'm all for doing things correctly and thoroughly at all times. And I also understand that one of the main purposes of OOP is for maintainability and extendability for the future. I just have a hard time wrapping my head around interfaces and abstract classes sometimes, and I have the feeling it's because the smaller projects I do rarely involve other people extending the code, or creating APIs and such.