I don't like it because of no compile-time type checking


this has been shown to be a red herring - compile time type checking rarely catches anything and test driven developmen is every bit as effective at catching these trivial to find and fix errors.

and no message access modifiers (private and protected).


But we have other conventions for indicating that methods are private and they work just as well. They include method categories with names like "private-event processing", method names that start with the word private - ie privateMouseDown:, or in the case of ObjectiveC, the convention is to start the method name with an underscore or simply to not declare it in the main class interface but rather to add the method as a private category.

I grant that there is no compiler enforcement of the programmer's intent, but I view this as a plus. Particularly because, in my experience, most programmers are really bad at deciding what should be private vs public and I often have to break their conventions to get the code to do what I need.

Bottom line, Smalltalk and ObjectiveC have a philosophy of "trust the programmer" and C++/Java have more of a "do unto others first" sort of mentality. I prefer the former.