Escrevi recentemente um artigo com um exemplo bem simples de desenvolvimento de uma aplicação para ambiente GNUstep, mas cometi a gafe de não dedicar algum tempo falando da linguagem de programação em questão, Objective C.Objective C, ou Objective-C, ou ObjC, é uma linguagem de programação reflectiva orientada a objetos criada nos idos da década de 1980 – mais ou menos na mesma época que o C++ – pelos fundadores da Stepstone, mais tarde adquirida pela NeXT. É na verdade uma camada bem fina sobre a linguagem C padrão.
Isso significa que, se você sabe programar em C, conseguirá programar em ObjC sem muito esforço.
Diferenças para C
Sobre a linguagem C, ObjC adiciona os seguintes recursos:
- Orientação a objetos, adaptada de Smalltalk.
- Tipo boleano –
BOOL. Verdadeiro éYESe falso éNO. - Comentário de linha, iniciado por
//(na época C não suportava). - A diretiva de preprocessador
#import, que funciona como#include, mas só inclui o cabeçalho se ele não foi incluído ainda. - O tipo
id, similar avoid *de C/C++. - A constante
nil, que é um objetoidsem valor:(id)0.
A maior parte dos comandos referentes a orientação a objetos começam com
@, como @interface, @implementation, @end, @private, @protected, @public, @protocol, etc.… Entre colchetes é avaliado o ambiente de mensagem, com uma sintaxe muito parecida com a de Smalltalk.Criando uma classe
Como exemplo, vamos criar a classe
Point, com os atributos x e y.Para tanto, primeiro criamos a interface no arquivo
Point.h:#ifndef _POINT_H
#define _POINT_H
#import <Foundation/Foundation.h>
@interface Point : NSObject
{
int x;
int y;
}
+ (id) newWithX: (int)valuex Y: (int)valuey;
- (id) initWithX: (int)valuex Y: (int)valuey;
- (int) diagonal;
- (int) getX;
- (int) getY;
- (void) setX: (int)value;
- (void) setY: (int)value;
@end
#endifAs diretivas
#ifndef, #define e #endif já são velhas conhecidas dos programadores C/C++. O #import já foi explicado, funciona parecido com #include.O cabeçalho
Foundation/Foundation.h inclui a classe NSObject, definida pela API OpenStep, usada aqui como classe pai de nossa classe Point.O comando
@interface inicia a descrição da interface e o comando @end encerra. O pequeno escopo entre chaves define os atributos de instância, protegidos por padrão – para defini-los como públicos a sintaxe seria:{
@public
int x;
int y;
}As linhas começadas por um sinal de menos (
-) indicam métodos de instância – métodos de classe são iniciados por +. Por exemplo:- (id) initWithX: (int)valuex Y: (int)valuey;Significa um método de instância que recebe dois atributos inteiros –
valuex e valuey, e retorna um id.Agora precisamos implementar a interface. Para isso vamos criar o arquivo
Point.m:#include <math.h>
#import "Point.h"
@implementation Point
+ (id) newWithX: (int)valuex Y: (int)valuey {
return [[Point alloc]
initWithX: valuex Y: valuey];
}
- (id) initWithX: (int)valuex Y: (int)valuey {
if ((self = [super init])) {
x = valuex;
y = valuey;
}
return self;
}
- (int) diagonal {
return (int) sqrt((double) ((x * x) + (y * y)));
}
- (int) getX {
return x;
}
- (int) getY {
return y;
}
- (void) setX: (int)value {
x = value;
}
- (void) setY: (int)value {
y = value;
}
@endO código é muito parecido com C, e até mesmo com C++, cabendo apenas alguns comentários:
selfé uma palavra reservada que representa a instância, comothisde Java e C++.superreferencia a classe pai, como em Java.- Repare no comando
[super init]: aqui é passada uma mensagem parasupere o valor retornado é atribuído aself.
Para instanciar um objeto, a sintaxe é:
id point = [Point newWithX: 4 Y: 5];Ou, com tipagem estática:
Point *point = [Point newWithX: 4 Y: 5];Para obter o valor de
x:printf("x = %d\n", [point getX]);E para mudar seu valor:
[point setX: 2];OpenStep
OpenStep é a API aberta para desenvolvimento de aplicações para NEXTSTEP, resultado de um trabalho colaborativo da NeXT com a SUN Microsystems.
Diversos sistemas e ambientes oferecem suporte a OpenStep, como OS X e GNUstep.
Diversos recursos interessantes são oferecidos nessa API, desde vantagens semelhantes à STL de C++, até conjunto de widgets para construção de janelas, toolkit.
Já vimos uma classe dessa API,
NSObject. Outra interessante é NSString, cuja finalidade é a mesma de std::string de C++ e String de Java.A criação de uma
NSString é:id url = [NSString stringWithCString: "http://kodumaro.blogspot.com/"];Há ainda um apelido sintático:
id url = @"http://kodumaro.blogspot.com/";Um forma legal de conhecer mais sobre OpenStep é ler os manuais de referência do GNUstep (toolkit aqui) e do OS X.
[]'s
Cacilhas, La Batalema
