protocols vs subclasses