Was entspricht geschützten Methoden in Objective-C? Ich möchte Methoden definieren, die nur die abgeleiteten Klassen aufrufen / implementieren dürfen.
objective-c
LK.
quelle
quelle
Sie können den geschützten und privaten Zugriff auf Methoden folgendermaßen simulieren :
Diese Schutzmaßnahmen werden, wie Sachin feststellte, zur Laufzeit nicht durchgesetzt (wie dies beispielsweise in Java der Fall ist).
quelle
UIGestureRecognizerSubclass.h
Folgendes habe ich getan, um geschützte Methoden für meine Unterklassen sichtbar zu machen, ohne dass sie die Methoden selbst implementieren müssen. Dies bedeutete, dass ich in meiner Unterklasse keine Compiler-Warnungen über eine unvollständige Implementierung erhielt.
SuperClassProtectedMethods.h (Protokolldatei):
SuperClass.m: (Der Compiler zwingt Sie jetzt, geschützte Methoden hinzuzufügen.)
SubClass.m:
quelle
performSelector
darauf.[(id)obj hiddenMethod]
. Genau genommen wird die geschützte Methode in Objective-C nicht unterstützt.Ich habe dies gerade entdeckt und es funktioniert für mich. Um Adams Antwort zu verbessern, führen Sie in Ihrer Oberklasse eine Implementierung der geschützten Methode in der .m-Datei durch, deklarieren Sie sie jedoch nicht in der .h-Datei. Erstellen Sie in Ihrer Unterklasse eine neue Kategorie in Ihrer .m-Datei mit der Deklaration der geschützten Methode der Oberklasse, und Sie können die geschützte Methode der Oberklasse in Ihrer Unterklasse verwenden. Dies verhindert letztendlich nicht, dass der Aufrufer der angeblich geschützten Methode zur Laufzeit gezwungen wird.
quelle
protectedMethod
Eine andere Möglichkeit, @protected-Variablen zu verwenden.
quelle
Sie können die Methode als private Methode der übergeordneten Klasse definieren und
[super performSelector:@selector(privateMethod)];
in der untergeordneten Klasse verwenden.quelle
Sie können eine Art dies mit einer Kategorie.
Die Methoden werden nicht ausgeblendet, wenn Sie die Kategorie in eine andere Klasse importieren, aber Sie tun es einfach nicht. Aufgrund der Dynamik von Objective-C ist es tatsächlich unmöglich, eine Methode unabhängig von einem aufrufenden Instanztyp vollständig auszublenden.
Der beste Weg ist wahrscheinlich die von @Brian Westphal beantwortete Klassenfortsetzungskategorie, aber Sie müssen die Methode in dieser Kategorie für jede untergeordnete Instanz neu definieren.
quelle
Eine Möglichkeit besteht darin, die Klassenerweiterung zum Ausblenden von Methoden zu verwenden.
In
.h
:In
.m
:quelle
@interface
Deklaration in der .m-Datei brauchen. Sie können einfach eine Funktion deklarieren und verwenden, und sie wird als privat behandelt.Normalerweise benenne ich geschützte Methoden mit internem Präfix:
quelle