is, is it ok to
1) have just an interface declaration with all the method and property
declarations,
Provalo. Troverai che senza una sezione @implementation per tutte le classi che usi (anche se le stai solo sottoclassando) ottieni un errore. È necessario un @implementation per ogni classe.
2) have a base class that adheres to that protocol (implements that
interface) but also provides a common implementation of some of those
classes, and only has empty stub method implementations for the rest
of the methods
Sì, puoi certamente farlo. Crea un'eccezione negli stub se vuoi forzare le sottoclassi a sovrascriverle.
3) have a bunch of subclasses (from that base class), that will
conform to that protocol - but - also inherit common method
implementations -and - implement on their own those stub methods?
Certo, nessun problema lì.
Un protocollo in realtà è solo un modo per specificare un insieme di metodi. Quando adotti un protocollo nella tua classe, prometti di fornire quei metodi nella tua classe, ma non prometti nulla su in che modo questi metodi sono implementati - il compilatore non si lamenterà se sono solo metodi vuoti che si ignorano nelle sottoclassi.
Un'altra possibilità è implementare i metodi comuni nella classe base senza adottare il protocollo in questione. Quindi, adotta il protocollo in ciascuna sottoclassi e implementa tutti i metodi che non erediti dalla classe base. Questo potrebbe non sembrare l'ideale, dal momento che ogni sottoclasse deve adottare il protocollo, ma può riflettere più accuratamente il modo in cui funziona il codice: la classe base non adotta il protocollo, solo le sottoclassi lo fanno. Se ti capita di istanziare la classe base e inviarla un messaggio -conformsToProtocol:
, otterrai NO
indietro.