Use proper Abstract Base Classes

So that incomplete implementations fail at initialization