La declaració d'una interfície de classe comença amb la directiva del compilador @interface i finalitza amb la directiva @end (Totes les directives a Objective-C cap al compilador comencen amb "@").
@interface ComDeClasse : LaSevaSuperclasse
{
declaracions de variables d'instància
}
declaracions de mètode
@end
La primera linia de la declaració representa el nom de la classe nova i enllaça amb la seva superclasse. La superclasse defineix la posició de la nova classe en la jerarquia d'herència, com s'ha discutit a "Herència". Si el doble punt i el nom de la superclasse s'ometeixen, la nova classe queda declarada com a classe arrel, un rival de la classe NSObject.
Seguint la primera part de la declaració de la classe, les claus contenen declaracions de les variables d'instància, les estructures de dades que són part de cada instància de la classe. Aquí hi ha una llista parcial de les variables d'instància que podria declarar-se en la classe Rectangle:
float amplada;
float alçada;
BOOL ple;
NSColor *colorPle;
Els mètodes de la classe són declarats més endavant, després les claus contenen les variables d'instànci i després el final de la declaració de la classe. Els noms dels mètodes que poden utilitzar-se pels objectes de classe, metodes de classe, van precedits per el signe més:
+ alloc;
Els mètodes que les instàncies d'una classe poden utiltizar, els mètodes d'instància es marquen amb el signe menys:
- (void) display;
Encara que no és una pràctica comunica, pots definir un mètode de classe i un mètode d'instància amb el mateix nom. Un mètode també pot tenir el mateix nom que una variable d'instància. Això és més comú, especialment si el mètode retorna el valor de la variable. Per exemple, el Cercle té un mètode radi que podria equivaldre a la variable d'instància radi.
Els mètodes retornen tipus que estan declarats utilitzant l'estàndard de la sintaxi C per repartir els paper d'un tipus i altre:
- (float) radi;
Els tipus d'arguments es declaren de la mateixa manera:
- (void) posarElRadi:(float)unRadi;
Si un tipus de retorn o argument no està declarat explícitament, s'asumeix que és del tipus per defecte per mètodes i missatges -- un id. El mètode alloc mostrat anteriorment retorna id.
Quan hi han més d'un argument, els arguments estan declarats dins el nom del mètode després dels doble punts. Els arguments trenquen la part del nom en la declaració, justament com en un missatge. Per exemple:
- (void) posarLAmplada:(float)amplada lAlçada:(float)alçada;
Els mètodes que agafen un nombre d'arguments els declara utilitzant una coma i els punts suspensius, justament com ho faria una funció:
- Agrupar:grup, ...;
El fitxer d'interfície ha d'incloure en algun modul de codi que depen de la interfície de classe -- aquest inclou algun mòdul que crea una instància de la classe, envia un missatge per invocar un mètode declarat per la classe, o menciona una variable d'instància declarada en la classe. La interfície normalment s'inclou amb la directiva #import:
#import "Rectangle.h"
Aquesta directiva és idèntica a #include, excepte que t'asegura que el mateix fitxer mai s'inclourà més d'una vegada. Per això és preferida i s'utilitza en lloc de #include en els exemples de codi en la documentació basada en Objective-C.
Per reflexar el fet que una definició de classe construeix en les definicions de classes d'herència, un fitxer d'herència comença important la interfície de la seva superclasse:
#import "LaSevaSuperclasse.h"
@interface NomClasse : LaSevaSuperclasse
{
declaracions de variables d'instància
}
declaracions de mètodes
@end
Aquesta convenció significa que cada fitxer d'interfície inclou, indirectament, els fitxers d'interfície per totes les classes heredades. Quan un mòdul de codi importa una interfície de classe, aquest obté les interfícies per la jerarquia d'herència sencera que la classe en s'està construint.
Fixeu-vos que si aquesta és una precomp -- una capçalera precompilada -- que suporta la superclasse, en lloc d'això pots preferir importar la precomp.
Un fitxer d'interfície declara un classe i, per importar la seva superclasse, implícitament conté declaracions per totes les classes heredades, des del NSObject per sota de la seva superclasse. Si la interfície menciona classes que no estan en la jerarquia, aquest ha d'importar-los explícitament o declarar-los amb la directiva @class:
@class Rectangle, Cercle;
Aquesta directiva simplement informa al compilador que "Rectangle" i "Cercle" són noms de classes. No importa els seus fitxers d'interfície.
Un fitxer d'interfície menciona els noms de classe quan es declaren estàticament les variables d'instància, els valors de retorn, i els arguments. Per exemple, aquesta declaració
- (void) possaElColorPrincipal: (NSColor *)unColor;
menciona la classe NSColor.
Declaracions com aquestes simplement utilitzen el nom de clase com un tipus i no depenen de cap detall de la interfície de classe (els seus mètodes i les variables d'instància), la directiva @class dona al compilador suficient sobreavís del que s'espera. Tanmateix, on la interfície d'una classe està actualment utilitzat-se (instàncies creades, missatges enviats), la interfície de la classe ha d'importar-se. Normalment, un fitxer d'interfície utilitza @class per declarar classes, i els fitxers d'implementació corresponents impoten les seves interfícies (a mida que necessitaran crear intàncies d'aquestes classes o enviar-los missatges).
La directiva @class minimitza la quantitat de codi revisat pel compilador i l'enllaçador, i per tant és la forma més simple per presentar una declaració del nom de la classe. Essent simple, evita problemes potencials que poden arribar amb l'importació de fitxers que importen parts d'altres fitxers. Per exemple, si una classe declara un variable d'instància estàticament d'una altra classe, i els seus dos fitxers d'interfície importen a l'altra, ninguna classe podrà compilar-se correctament.
El propòsit del fitxer de la interfície és declarar la nova classe a altres mòduls de codi (i a altres programadors). Conté tota la informació que es necessita per treballar amb la classe (els programadors també poden apreciar una petita documentació).