It seems the larger point here is that more evolved type systems allow for a better bidirectional decoupling of interfaces and implementations. Rust has a lot of things that make this easier-yet-governable. The commenter (
jstimpfle) who mentioned C is also right - C properly used allows one to do things, since it's not bound by OOP strictures.