Próbuję zrozumieć nieformalne protokoły, do tej pory wiem, że nieformalne protokoły są rodzajem kategorii, ale dlaczego delegaci nie mają nazwy kategorii?
Przykład:
#import <Cocoa/Cocoa.h>
@class FileSystemNode;
@interface AppController : NSObject { // Where is the Category ????
@private
IBOutlet NSBrowser *_browser;
FileSystemNode *_rootNode;
}
@end
Dzięki.
Odpowiedzi:
1 dla odpowiedzi № 1Nieformalne protokoły są nie "rodzaj kategorii".
Jeśli klasa jest zgodna z protokołem (na przykład @interface MyClass <MyProtocol>
) jest gwarantowane, że możesz wywołać wszystkie metody tej klasy, które są wymagane przez MyProtocol
. (O ile klasa naprawdę ich nie implementuje [linker nie może tego wiedzieć z powodu dynamicznego wiązania], który jest błędem programistycznym i kłamstwem, ale zazwyczaj tak nie jest.)
Kategorie z drugiej strony pozwalają ci wziąć już istniejącą klasę i rozszerzyć ją o nowe metody (np removeAllSubviews
metoda do już istniejącego NSView
klasa).
Tak więc kategorie i protokoły są zupełnie przeciwne sobie.