Nous allons voir dans ce billet quelques différences entre la déclaration des classes en Objective-C et en C++.

Création d'une classe

En C++ nous avons besoin de deux fichiers pour créer une classe: un fichier header (.h ou .hh) qui contiendra la description de la classe et un fichier d'implémentation (.cpp) qui contiendra le corps des méthodes définies dans le header. Pour l'Objective-C, cela est fortement similaire, excepté l'extension du fichier d'implémentation (.m au lieu de .cpp)

MyClass.h (C++)

class MyClass : public BaseClass {private:int number;public:int getNumber() const;void setNumber(int number);void otherMethod();int addNumberAToNumberB(int a, int b);public:static int staticMethod();};

MyClass.h (Objective-C)

@inteface MyClass : NSObject@property int number;- (void) otherMethod;- (int) addNumberA: (int)a toNumberB: (int)b;* (int) staticMethod;  @end

Vous pouvez voir quelques différences: Tout d'abord la syntaxe: @interface et @end qui délimite la définition de la classe.

Attention toutefois, interface n'a pas la même signification en C++. Son équivalent en Objective-C est le protocol que nous verrons plus tard.

@property permet de déclarer une variable d'instance.Les getters et setters des @property sont générés automatiquement. Il est possible de redéfinir le nom des setters/getter, et de préciser si vous ne voulez générer qu'un getter.

Le signe - en Objective-C signifie que nous déclarons une méthode d'instance. Le signe +, lui, signifie que nous déclarons une méthode de classe.

Le nom des méthodes avec plusieurs arguments sont scindés en fonction du nombre de ces derniers. Cela peut paraitre assez déroutant mais cela nous force à écrire des noms de méthode très explicite.

Il n'y a pas vraiment de méthode ou attributs privés, en effet tout ce qui est exposé dans l'@interface est public.

Le code privé est donc laissé à la discrétion du développeur dans le fichier d'implémentation.

Comme en C++, l'héritage se fait après le nom de la classe suivi des deux points.Il est important de préciser que contrairement au C++, avec l'Objective-C nous ne pouvons pas faire d'héritages multiple.

Implémentation

L'implémentation est assez similaire dans les deux langages:

MyClass.cpp

#include "MyClass.h"int MyClass::getNumber() const {// content}void MyClass::setNumber(int number){// content}void MyClass::otherMethod(){// content}int MyClass::addNumberAToNumberB(int a, int b){// content}

MyClass.m

#import "MyClass.h"@implementation MyClass- (void) otherMethod {  // content  }- (int) addNumberA: (int)a toNumberB: (int)b {  // content  }* (int) staticMethod {  // content  }  @end

La qualification des fonctions est toutefois nécessaire au C++, alors qu'en Objective-C seul le nom des fonctions est requis. Le @implementation défini un scope un peu comme un namespace.