Puoi usare un protocollo, in questo modo:
@protocol kObject
- (instancetype) initWithKey: (NSString *) key; // I'm assuming the key is a string.
- (void) send;
- (void) processKey;
@end
Tuttavia, non è raro in Objective-C che gli inizializzatori vengano dichiarati in un protocollo e per applicare l'LSP è necessario digitare qualsiasi metodo o funzione che ha utilizzato una di queste classi come id<kObject>
, che è atipico dato il use case.
Generalmente, in Objective-C non c'è nulla che possa impedire l'implementazione o il richiamo di una classe base. Quello che ho fatto in passato è lasciato commenti nell'intestazione, e l'implementazione predefinita ha generato un'eccezione. Non riceverai errori in fase di compilazione, ma il codice si fermerà e potrai applicare i vincoli del tuo design in questo modo.
Penso al motto di Python, "Siamo tutti adulti consenzienti" ogni volta che si tratta di classi astratte in Objective-C - è sul programmatore di far rispettare questo dato la natura altamente dinamica e (praticamente) interamente pubblica di Objective-C . Confido che se dico che non dovrebbe essere fatto, sarà rispettato. Le eccezioni fanno rispettare questo, anche se un po 'pesante. In alternativa, puoi anche far tornare immediatamente i metodi - rendendo la classe inutile.
Per inciso, potresti avere la fortuna di dichiarare la proprietà come una variabile di istanza protected
, nel caso non avessi bisogno di altre classi, metodi o funzioni per accedere direttamente alla proprietà kObject
.