Every class has an interface : * Interfaces may be explicit, like when classes implement some `interface` or conforms to some `protocol`; * Interfaces may be implicit: it's what a class defines top be visible from the outside and to be used by other class, hiding the internals. You might for example read a lot of advices about the use of interfaces in patterns in the [GoF][1], but most of the code examples in that book are C++ code, sometimes with pure abstract classes (the C++ equivalent to `interface`), often, just referring to an implicit class. So don't get mislead by ambiguity of words: you always need to think about interfaces when creating classes. At least their implicit interface. The key is to see it as a black-box, i.e. think of it as if someone else could rewrite it and you wouldn't know its internals. This is not overenginering. It's just OOP. Some of these implicit interfaces may need to be reused for different classes either in full or in part. Sometimes unrelated. This is the moment when you go one step further and create an explicit separate interface. [1]: https://en.wikipedia.org/wiki/Design_Patterns