This is Liskov Substitution. TIt's applicable to both static and dynamic languages because behavioral subtyping cannot be checked by a compiler.
So if it semantically makes sense, you need all the methods of the parent and also satisfies Liskov then it is a good candidate for strong behavioral subtyping, which can be expressed via an IS-A relationship; although not guaranteed since it's undecideable and therefore applicable to both static & dynamic languages (a compiler can't catch it).relationship
What you're expressing is that the child class must have an is-a relationship with the parent and what you're implying is that type: child is a subset of type: parent, therefore the parent can be substituted with the child without the potential for crashes or incorrect behaviour.
Otherwise it violates the Liskov Principle..
... which means you can't safely assume they can be called like that with a guarantee they would always work correctly.
HoweverBut that misses one of the major points of OOP, polymorphism; which ismeans you lost the ability to treatof treating all subsets of a type in a uniform method. So you have to find the right design that maximizes code reuse and correct & safe type relations.
I don't think mixins are that much differentjust a type of than composition. AFAIK mixins are, usually found in languagelanguages that don't support multiple inheritance and need to emulate it.
The point is to find a middle ground where the minimal amount of code is duplicated, maximum polymoprhism by having a model with the minimal amount of types & at the same avoid caveats such as this one.