Frage

Kann mir jemand erklären, die Unterschiede zwischen Protokolle und Kategorien in Objective-C? Wann Sie einen über die andere verwenden?

War es hilfreich?

Lösung

Ein Protokoll ist das gleiche wie eine Schnittstelle in Java: Es ist im Wesentlichen ein Vertrag, der sagt: „Jede Klasse, die dieses Protokoll implementiert wird auch diese Methoden implementieren.“

Eine Kategorie, auf der anderen Seite, bindet nur Methoden zu einer Klasse. Zum Beispiel in Kakao , ich eine Kategorie für NSObject erstellen kann, die mich erlauben, Methoden zur NSObject Klasse hinzuzufügen (und natürlich alle Unterklassen), obwohl ich nicht wirklich Zugang zu NSObject .

Fazit: ein Protokoll spezifiziert, welche Methoden eine Klasse implementieren; eine Kategorie ergänzt Methoden zu einer vorhandenen Klasse.

Die richtige Verwendung der einzelnen, sollte dann sein, klar: Verwenden Protokolle eine Reihe von Methoden zu erklären, dass eine Klasse implementieren muss, und verwenden Sie Kategorien Methoden zu einer vorhandenen Klasse hinzufügen

Andere Tipps

Ein Protokoll sagt: „Hier sind einige Methoden Ich mag würde Sie zu implementieren.“ Eine Kategorie sagt: „Ich bin die Funktionalität dieser Klasse mit diesen zusätzlichen Methoden erweitern.“

Nun, ich vermute, Ihre Verwirrung von Apples Verwendung des Ausdrucks „informelles Protokoll“ stammt. Hier ist der Schlüssel (und die meisten verwirrend) Punkt: ein informelles Protokoll ist eigentlich kein Protokoll überhaupt. Es ist eigentlich eine Kategorie auf NSObject. Cocoa verwendet informelle Protokolle pervasively Schnittstellen für die Teilnehmer zur Verfügung zu stellen. Da die @protocol Syntax nicht optional Methoden bis Objective-C zuließ 2.0, umgesetzt von Apple optional Methoden nichts zu tun (oder einen Dummy-Wert zurück) und die erforderlichen Methoden eine Ausnahme zu werfen. Es gab keine Möglichkeit, dies durch den Compiler zu erzwingen.

Jetzt, mit Objective-C 2.0 unterstützt die @protocol Syntax des @optional Schlüsselwort, einige Methoden in einem Protokoll als optionale Markierung. Somit entspricht der Klasse auf ein Protokoll, solange es als @required markiert alle Methoden implementiert. Der Compiler kann bestimmen, ob Ihre Klasse alle erforderlichen Methoden implementiert, auch, was eine große Zeitersparnis ist. Das iPhone SDK verwendet ausschließlich die Objective-C 2.0 @protocol Syntax, und ich kann aus einem guten Grunde nicht denkt nicht, dass es in jeder neuen Entwicklung zu nutzen (außer Mac OS X Cocoa-Anwendungen, die in früheren Versionen von Mac OS X ausgeführt werden müssen ).

Kategorien:

Eine Kategorie ist ein Weg, um neue Methoden der Zugabe auf alle Instanzen einer vorhandenen Klasse ohne die Klasse selbst zu verändern.

Sie verwenden eine Kategorie aus, wenn Sie die Funktionalität zu einer vorhandenen Klasse hinzufügen möchten, ohne von dieser Klasse abgeleitet oder Umschreiben der ursprünglichen Klasse.

Angenommen, Sie NSView Objekte in Kakao verwenden, und Sie finden sich wünschen, dass alle Instanzen NSView der Lage waren, eine Aktion auszuführen. Natürlich können Sie nicht die NSView Klasse umschreiben, und selbst wenn man daraus ableiten, nicht alle der NSView Objekte in Ihrem Programm wird von der abgeleiteten Typ sein. Die Lösung ist eine Kategorie NSView zu erstellen, die Sie dann in Ihrem Programm verwenden. Solange Sie die Header-Datei mit Ihrer Kategorie Erklärung #import, wird es erscheinen, als ob alle NSView Objekt reagiert auf die Methoden, die Sie in der catagory Quelldatei definiert ist.

Protokolle:

Ein Protokoll ist eine Sammlung von Methoden, die jede Klasse können wählen, implementieren.

Sie verwenden ein Protokoll, wenn Sie eine Garantie zur Verfügung stellen mögen, dass eine bestimmte Klasse zu einem bestimmten Satz von Methoden reagieren. Wenn eine Klasse ein Protokoll nimmt, verspricht sie alle Methoden in den Protokoll-Header deklarierten zu implementieren. Dies bedeutet, dass alle anderen Klassen, die diese Klasse verwenden, können sicher sein, dass diese Methoden, umgesetzt werden, ohne dass anyting sonst über die Klasse kennen.

Dies kann nützlich sein, wenn eine Familie von ähnlichen Klassen erstellen, die alle brauchen, um mit einer gemeinsamen „Controller“ Klasse zu kommunizieren. Die Kommunikation zwischen dem Controller-Klasse und den gesteuerten Klassen können alle in einem einzigen Protokoll verpackt werden.

Side Anmerkung: die Sprache Objective-C keine Mehrfachvererbung nicht unterstützt (eine Klasse nur von einer übergeordneten Klasse ableiten), aber viel von der gleichen Funktionalität kann durch Protokolle zur Verfügung gestellt werden, da eine Klasse auf mehr verschiedenen Protokolle anpassen kann.

Zu meinem Verständnis Protokolle sind ein bisschen wie die Java-Schnittstellen. Protokolle erklären Methoden, aber die Umsetzung ist für jede Klasse auf. Kategorien scheint so etwas wie Rubys Mixins zu sein. Mit Kategorien können Sie Methoden, um bestehende Klassen hinzuzufügen. Auch integrierte Klassen.

Ein Protokoll ermöglicht es Ihnen, eine Liste von Methoden zu erklären, die auf eine bestimmte Klasse oder Kategorien nicht beschränkt sind. Die Verfahren in dem Protokoll deklariert sind, können alle Klassen / Kategorien erlassen. Eine Klasse oder Kategorie, die ein Protokoll übernimmt, müssen alle erforderlichen Methoden im Protokoll erklärt implementiert.

Eine Kategorie können Sie zusätzliche Methoden zu einer vorhandenen Klasse hinzufügen, aber sie erlauben keine weitere Instanz Variablen. Die Methoden die Kategorie fügt Teil des Klassentypen worden.

Protokolle sind Verträge, die festgelegten Methoden zu implementieren. Jedes Objekt, das ein Protokoll entspricht stimmt Implementierungen für die Methoden zur Verfügung zu stellen. Eine gute Verwendung eines Protokolls wäre eine Reihe von Callback-Methoden für einen Delegierten zu definieren (wo die Delegierten auf alle Methoden reagieren muss).

Kategorien bieten die Möglichkeit, ein aktuelles Objekt zu erweitern, indem Methoden, um es (Klassen- oder Instanzmethoden) hinzugefügt wird. Eine gute Verwendung für eine Kategorie wäre die NSString-Klasse erweitert Funktionalität hinzuzufügen, die vorher nicht da war, wie ein Verfahren, das Hinzufügen eine neue Zeichenfolge zu erstellen, die den Empfänger in 1337 5P34K umwandelt.

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

Definitionen von S.G.Kochan der "Programming in Objective-C":

Kategorien:

Eine Kategorie bietet eine einfache Möglichkeit für Sie die Definition einer Klasse in Gruppen oder Kategorien von verwandten Methoden modularisieren. Es gibt Ihnen auch eine einfache Möglichkeit, eine bestehende Klassendefinition ohne auch Zugriff auf den ursprünglichen Quellcode für die Klasse zu erweitern und ohne eine Unterklasse erstellen zu müssen.

Protokolle:

Ein Protokoll ist eine Liste von Methoden, die zwischen den Klassen geteilt wird. Die Verfahren im Protokoll aufgelistet haben keine entsprechenden Implementierungen; sie soll von jemand anderem durchgeführt werden (wie Sie!). Ein Protokoll bietet eine Möglichkeit, einen Satz von Methoden festzulegen, die mit einem bestimmten Namen irgendwie verwandt sind. Die Methoden werden dokumentiert typischerweise so, dass Sie wissen, wie sie durchzuführen sind und so dass Sie sie in Ihren eigenen Klassendefinitionen zu implementieren, falls gewünscht. Eine Protokollliste eine Reihe von Methoden, von denen einige Sie optional implementieren können, und andere, die Sie verpflichtet sind, zu implementieren. Wenn Sie sich entscheiden, alle erforderlichen Methoden für ein bestimmtes Protokoll zu implementieren, sind Sie sagte entsprechen oder dieses Protokoll erlassen. Sie sind berechtigt, ein Protokoll zu definieren, wo alle Methoden sind optional, oder eine, wo alle erforderlich sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top