2016-10-03 2 views
0

Ich arbeite an einer App, wo ich MSR-Kartendaten analysieren muss, um nach einer bestimmten Benutzer-ID-Nummer zu suchen. Die Besonderheiten des Parsens werden für verschiedene Clients unterschiedlich sein. Idealerweise würde ich gerne separate Klassen schreiben, die dieselbe Schnittstelle implementieren und auswählen, welche zur Laufzeit verwendet werden soll. Es gibt auch eine Web-Komponente, also habe ich in PHP einfach eine Schnittstelle erstellt, dann einige verschiedene Klassen, die es implementieren, und wählen, welche basierend auf einem Konfigurationswert instanziiert werden soll. Was ist der richtige Weg, dies in Objective-C zu tun?Objective-C: Wie man die Implementierung zur Laufzeit entscheidet

Ich habe den Pfad mit einem Protokoll gestartet, kann aber nicht herausfinden, wie die Implementierung festgelegt wird, die der aufrufende Code verwenden soll. Müsste ich alle Implementierungsklassen importieren und dann einen Schalter schreiben? Es scheint, als sollte es einen einfacheren Weg geben.

Danke

Antwort

2

Der Protokollansatz ist ein guter. Sie definieren die Schnittstelle im Protokoll und haben dann verschiedene konkrete Klassen, um sie zu implementieren. Sie haben dann eine statische Methode, die entscheidet, welche zu verwenden und zurückzugeben, aber der Aufrufer kennt nicht den konkreten Typ, nur dass es Ihr Protokoll implementiert, da der Rückgabetyp das Protokoll ist.

diese Weise die gesamte Logik zu entscheiden, welche Klasse zu verwenden, und das ganze Wissen der verschiedenen konkreten Klassen wird in diesem einzigen Fabrik Verfahren eingekapselt und der Angerufene Code sagt nur:

// MSRParser is the protocol defining the interface. 
// MSRParserHelper is a class with a class method (+) 
MSRParser parser = [MSRParserHelper parserForCard:aCard]; 
[parser doParserThings]; 

Sie sehen also, es muss nicht wissen, was die Klasse ist, nur dass sie dem Protokoll entspricht.

+0

Das sieht genau so aus, was ich machen möchte. Ich denke, ich vermisse nur die Fabrikklasse/Methode. Wenn es dir nichts ausmacht, könntest du mir einen kleinen Pseudocode geben, wie MSRParserHelper aussehen könnte? – nicthu

+0

Es wäre eine Klasse mit einer einzigen öffentlichen [Klassenmethode] (https://developer.apple.com/library/prerelease/content/documentation/General/Conceptual/DevPedia-CocoaCore/ClassMethod.html) - die Syntax wird angezeigt in der Dokumentation, aber die Implementierung dieser Funktion ist ganz spezifisch für Ihre Situation, Sie würden die "Karte" untersuchen und entscheiden, welche von mehreren anderen Klassen zu verwenden, dann erstellen und eins zurückgeben. – jhabbott

+0

Yep - Ich habe das sortiert, funktioniert super. Danke noch einmal! – nicthu

Verwandte Themen