Separating the subtype hierarchy from the inheritance of implementation