a principal point of an abstract class is that we don't care how subclasses are implemented, provided methods x, y, and z exist
Sure you do; you're forcing them to inherit from an abstract base class and to declare the existence of their methods at compile-time. That's two implementation details that your approach enforces.
Whether that's good or bad, you tell me. :)
One feature that could save a lot of cut and pasted code is support for mixins in the descendant classes. If there's no inheritance of implementation, there really ought to be another way to reuse similar code.