protocol vs subclassing