Message Passing, Duck Typing, Object Composition, and not Inheritance
fitzgeraldnick.com
fitzgeraldnick.com
Are there any languages that do separate implicit delegation and type polymorphism?
The only valid absolute is that bloggers that insist otherwise are wrong.
I recently replaced a containment relationship with an inheritance relationship.
Sometimes inheritance does make sense yet despite it being the least-bad "tool for the job", it seems awkward, fragile and ill-thought-out. You have some attributes hidden in the parent and attributes right there in the child. The idea that the ontological relationships "is-a", "has-a" etc should map cleanly to the class as buckets-of-functions-and-attributes isn't always correct and muddies the water IMHO.
I wish that there was something that worked like inheritance but was better. Perhaps a system of passing interfaces from objects to the object they contain would make things clearer and more flexible.
How is this not inheritance? You still have some attributes "hidden" in the contained object and some "right there" in the child.
Or, you know...not. Sometimes, inheritance is the perfect abstraction for the job, neither awkward nor fragile, but perfectly elegant. Which was my point.
When you've got an is-a relationship, inheritance often makes sense, and encapsulation is frequently awkward. When you've got a has-a relationship, inheritance is frequently awkward. Just because you can find an awkward use of inheritance or a leaky abstraction doesn't mean that inheritance is awkward. It's a tool with limitations, and the world is a messy place. Containment isn't a magic bullet, either.
I honestly don't understand where the bias against concepts comes from. When the concept works, you use it. When it doesn't, you don't. It's engineering, not religion.
See http://golang.org/doc/effective_go.html#interfaces_and_types and http://golang.org/doc/effective_go.html#embedding.
Imho every class definition in Java-like OO languages should create two types: A (by default) public interface and a (by default) private class.
When you want to inherit from something you should then be able to choose if you want to inherit only the interface or inherit from the full class. Every good design already separates interface from implementation, so why isn't it enforced at the object system layer?
"The beauty here is that you can reuse code without dealing with inheritance, or any sort of class-based hierarchy."
... That's the beauty? The only beauty if that you managed to avoid a feature of the language? Ouch.
I get that really dumb things can be done with inheritance, but that's true for almost any language feature. It's certainly no reason to avoid it altogether.