Video: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2024
Een protocol definieert reeksen methoden die door elke klasse kunnen worden geïmplementeerd. Beschouw protocollen als definiërende interfaces die klassen moeten implementeren. Protocollen worden vaak gebruikt om de interface voor gemachtigde objecten te specificeren.
Met de protocolfunctie kunt u voorkomen dat subklassen moet worden geforceerd om polymorfe klassen te maken. Objective-C (in tegenstelling tot C ++) staat niet toe dat een klasse meerdere superklassen heeft. Protocollen zijn daarom een essentieel kenmerk in Objective-C, omdat er geen sprake is van meerdere overerving.
Wanneer een klasse de methoden implementeert in een protocol, wordt gezegd dat de klasse conform is voor het protocol.
De definitie van een protocol lijkt op de definitie van een interface voor een klasse. Een protocol heeft echter geen bovenliggende klasse- of instantievariabelen. Hier is een voorbeeld van een protocoldefinitie (afdrukbaar) van het postfix-rekenmachineprogramma:
@protocol afdrukbaar - (ongeldig) printMe; // Ik kan @required weglaten, omdat dit de standaard @optional - (NSString *) printMeToString is; -d Met de komst (en inderdaad met veel tamtam) van Objective-C 2. 0 kunnen protocolmethoden worden vereist (standaard) of optioneel.
Dit is de implementatie van het protocol in de klasse StackOfInteger:
@implementation StackOfInteger; … Andere StackOfInteger-methoden … /////////// Methoden voor het implementeren van het afdrukbare protocol //////////// - (void) printMe {int k, stackCount = [aantal elementen]; NSLog (@ "Stack-> Last>% dlast); for (k = 0; k% @
Merk op dat de methode printMeToString niet is geïmplementeerd omdat deze optioneel is.
< ! --1 -> Een programma kan testen of een object voldoet aan een protocol De volgende code bevat voorbeelden van deze test (uit het hoofdprogramma van het monster): printf ("Testen conformiteit met protocolsn "); if ([myStack conformToProtocol: @protocol (Printable)]) {printf (" Using protocol methodsn "); [myStack printMe];} else {NSLog (@" Object voldoet niet aan protocol% @ n ", @protocol (afdrukbaar));} id someObject = [[PostfixCalculator alloc] initWithExpression: @ "44 55 *"]; if (! [someObject conformToProtocol: @protocol (Printable)]) {NSLog (@ "Object voldoet niet aan protocol ");}
Omdat het myStack-object overeenkomt met het protocol, worden de methoden printMe en printMeToString aangeroepen. Aangezien someObject (wat type-id is om het voorbeeld zinvoller te maken) niet voldoet aan het afdrukbare protocol, voldoet de test voor conformiteit mislukt.
Je kunt ook testen of er een optionele methode bestaat met de methode respondsToSelector. U kunt van een klasse een protocol maken door eenvoudig de methoden te implementeren die door dat protocol zijn gedefinieerd. Dat wil zeggen, u hoeft het protocol niet in zijn interface aan te geven. Hoewel de klasse de protocollen implementeert, zal
niet zich conformeren aan het protocol en zal de vorige conformantietest mislukken.