Inheriting and adding associated types in protocols