The problem is that extension classes aren't really subtypes of extended classes anymore. They violate the Liskov Substitution Principle.
Interfaces for encapsulation don't have this problem.
(Though it'd be great if all languages had something like c#'s "override" keyword :).)
UPDATE: I was mistaken. Different methods are called on an object in different static "contexts". For example:
((ArtisticCowboy)joe).draw()
runs one method, and((Cowboy)joe).draw()
runs another.This is what C# does, but I don't know if it's wise.