I think this sort of mis-identifies the problem: the problem isn’t the wrong abstraction, it’s that later programmers don’t feel free to refactor to a better abstraction. Especially in languages with good refactoring tools (I.e. Java), inlining and refactoring is a much lower cost than the long-term maintenance cost of duplication.