Jaki jest odpowiednik metod chronionych w Objective-C? Chcę zdefiniować metody, które mogą wywoływać / implementować tylko klasy pochodne.
objective-c
LK.
źródło
źródło
Możesz zasymulować chroniony i prywatny dostęp do metod, wykonując następujące czynności:
Te zabezpieczenia nie są, jak zauważył Sachin, wymuszane w czasie wykonywania (jak na przykład w Javie).
źródło
UIGestureRecognizerSubclass.h
Oto, co zrobiłem, aby chronione metody były widoczne dla moich podklas, bez konieczności ich implementacji. Oznaczało to, że nie otrzymałem ostrzeżeń kompilatora w mojej podklasie o niekompletnej implementacji.
SuperClassProtectedMethods.h (plik protokołu):
SuperClass.m: (kompilator wymusi teraz dodanie chronionych metod)
Podklasa m:
źródło
performSelector
na nim.[(id)obj hiddenMethod]
. Dokładnie mówiąc, metoda chroniona nie jest obsługiwana w Objective-C.Właśnie to odkryłem i działa dla mnie. Aby ulepszyć odpowiedź Adama, w swojej superklasie zrób implementację chronionej metody w pliku .m, ale nie deklaruj jej w pliku .h. W swojej podklasie utwórz nową kategorię w swoim pliku .m z deklaracją chronionej metody nadklasy i możesz użyć chronionej metody nadklasy w swojej podklasie. Nie zapobiegnie to ostatecznie wywołującemu rzekomo chronionej metody, jeśli zostanie wymuszone w czasie wykonywania.
źródło
protectedMethod
Inny sposób wykorzystania @chronionych zmiennych.
źródło
Możesz zdefiniować metodę jako prywatną metodę klasy nadrzędnej i używać jej
[super performSelector:@selector(privateMethod)];
w klasie potomnej.źródło
Można rodzaj zrobić z kategorii.
Metody nie są ukryte, jeśli importujesz kategorię do innej klasy, ale po prostu tego nie robisz. Ze względu na dynamiczny charakter Objective-C niemożliwe jest całkowite ukrycie metody, niezależnie od typu wywołującej instancji.
Najlepszym sposobem jest prawdopodobnie kategoria kontynuacji klasy, na którą odpowiedział @Brian Westphal, ale będziesz musiał ponownie zdefiniować metodę w tej kategorii dla każdej instancji z podklasą.
źródło
Jedną z opcji jest użycie rozszerzenia klasy do ukrycia metod.
W
.h
:W
.m
:źródło
@interface
deklaracji w pliku .m. Możesz po prostu zadeklarować funkcję i użyć jej, a będzie ona traktowana jako prywatna.Zwykle nazywam metodę chronioną wewnętrznym prefiksem:
źródło