Aderire ad un protocollo ed essere una sottoclasse allo stesso tempo?

3

Nell'obiettivo C, ho una situazione in cui mi piacerebbe avere un protocollo astratto (interfaccia) con 5 metodi e 4 proprietà, ma allo stesso tempo, mi piacerebbe avere un'implementazione comune di 3 di quelle 5 metodi.

Quindi la mia domanda è, va bene per

1) hanno solo una dichiarazione di interfaccia con tutto il metodo e le dichiarazioni di proprietà,

2) hanno una classe base che aderisce a quel protocollo (implementa quell'interfaccia) ma fornisce anche un'implementazione comune di alcune di queste classi e ha solo implementazioni del metodo di stub vuoto per il resto dei metodi, e infine,

3) hanno un gruppo di sottoclassi (da quella classe base), che si conformeranno a quel protocollo - ma - erediteranno anche implementazioni di metodi comuni - e - implementeranno da soli quei metodi di stub?

    
posta Earl Grey 08.11.2012 - 13:16
fonte

2 risposte

4

Questo è lo schema che viene spesso utilizzato per risolvere la mancanza di classi astratte in Obiettivo C.

È molto comune che gli stub di metodo mancanti dell'implementazione di base sollevino un'eccezione, per assicurarsi di ottenere implementazioni incomplete. Vedi questa risposta sullo stack overflow per i dettagli su come è comunemente fatto.

    
risposta data 08.11.2012 - 13:27
fonte
1

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.

    
risposta data 08.11.2012 - 15:03
fonte

Leggi altre domande sui tag