If you think that separation of interface and implementation violates DRY, they you are taking DRY way too literally.
Primary consideration for DRY are duplicated copy pasted implementations scattered all over, as well as duplicate information where change to one piece implies change to other piece and there is no automatic (compiler) check to guarantee you will not forget keeping those changes in sync. Compiler can enforce that your interface/implementation changes are consistent.
As far as browsing code is concerned, there is another aspect. When you are trying to grasp interface of large class where implementation just gets on your way.
When I add it all up I still much more prefer having clean separation between interface and implementation.