1st: Can you translate a sentence that takes an argument into a DOT NOTATION sentence?, for example
frac3 = [frac1 sumar: frac2];
into something like
frac3 = frac1.sumar: frac2;
2nd: In the FractionTest, my method 'add' (sumar) is not calling another function 'reduce' (reducir) when I use the keyword SELF, but it does work when I substitute it with the word frac3 (which is my instace class name), why isn't it working with the self keyword?
Here is my code:
Fraction.h
#import <Foundation/Foundation.h>
@interface Fraccion : NSObject
{
int numerador, denominador; // Variables de instancia de la clase
}
// Si sintetizamos la variables se crean los 'getters' y 'setters' automaticamente y ya podemos usar el 'DOT NOTATION', los getters creados se llaman como su mismo nombre 'numerador' y 'denominador', cuando queramos llamarlos simplemente con ese nombre, mientras que los getters creados se crean con el nombre de 'set' + el numbre de tu variable con la primera letra en MAYUSCULA 'setNumerador' y 'setDenominador'
@property int numerador, denominador; // Las vamos a sintetizar, para eso se necesitan 2 pasos '@property' y '@synthezise', el '@synthezise' se declara en la fase de implementacion
// Declaramos los metodos de la clase
-(void) imprimir;
-(void) alistarNumerador: (int) n yDenominador: (int) d; // Ya no es necesario, es simplemente para hacerlo todo en un mismo renglon
-(void) reducir;
-(Fraccion *) sumar: (Fraccion *) f; // Este metodo te regresa una instancia de la clase y recibe como argumento a otra instancia de la misma clase
-(double) convertirAEntero;
@end
Fraction.m
#import "Fraction.h" // Importamos el nombre de nuestra clase entre comillas
@implementation Fraccion
@synthesize numerador, denominador; // Esta es la fase en la cual sintetizamos nuestras variables de instancia, en este paso a diferencia de @property, omitimos la palabra 'int', 'float', 'double', 'char', etc.
// Los metodos declarados en la fase anterior '@interface' seran definidos en esta fase '@implementation'
-(void) imprimir
{
NSLog(@"\n\n%i / %i\n\n", numerador, denominador);
}
-(void) alistarNumerador: (int) n yDenominador: (int) d // Ya no es necesario, es simplemente para hacerlo todo en un mismo renglon
{
numerador = n;
denominador = d;
}
-(void) reducir
{
int n = numerador, d = denominador, temp;
while (d)
{
temp = n % d;
n = d;
d = temp;
}
numerador /= n;
denominador /= n;
}
-(Fraccion *) sumar: (Fraccion *) f // Este metodo te regresa una instancia de la clase y recibe como argumento a otra instancia de la misma clase
//Para sumar 2 fracciones: a/b + c/d = ((a*d) + (b*d)) / (b*d)
{
Fraccion *frac3 = [[Fraccion alloc] init]; // Le asignamos un espacio en la memoria, por lo cual se debera expulsar en el programa principal
int resDenominador, resNumerador;
resNumerador = (numerador * f.denominador) + (denominador * f.numerador); // = (numerador * [f denominador]) + (denominador * [f numerador]);
resDenominador = denominador * f.denominador; // = denominador * [f denominador];
frac3.numerador = resNumerador; // = [frac3 numerador] = resNumerador;
frac3.denominador = resDenominador; // = [frac3 numerador] = resDenominador;
self.reducir; // = [self reducir]; = en ESTE CASO a frac3.reducir; o [frac3 reducir];
// self en ESTE CASO = frac3
//frac3.reducir;
return frac3;
}
-(double) convertirAEntero
{
if (denominador)
{
return (double) numerador / denominador;
} else {
return 1.0;
}
}
@end
FractionTest.m
#import "Fraction.h" // Importamos la clase, siempre importamos el archivo '.h'
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Creamos nuevos objetos con su nombre de instancia
Fraccion *frac1 = [[Fraccion alloc] init];
Fraccion *frac2 = [[Fraccion alloc] init];
Fraccion *frac3; // A este objeto le damos nombre de instancia, pero no lo creamos, porque se crea en el metodo de la clase 'sumar', pero somos responsables de darle un nombre de instancia en nuestro programa principal y de hacerle un 'release'
frac1.numerador = 1;
frac1.denominador = 4;
// Los ultimos 2 renglones = [frac1 alistarNumerador: 1 yDenominador: 4];
[frac2 alistarNumerador: 1 yDenominador: 2]; // Ya no es necesario, es simplemente para hacerlo todo en un mismo renglon
/* El ultimo renglon = a los siguientes 2 renglones
frac2.numerador = 1;
frac2.denominador = 2;
*/
frac1.imprimir; // = [frac1 imprimir];
NSLog(@"\n\n+\n\n");
[frac2 imprimir]; // = frac2.imprimir;
NSLog(@"\n\n=\n\n");
frac3 = [frac1 sumar: frac2];
frac3.imprimir; // = [frac3 imprimir];
[[frac1 sumar: frac2] imprimir];
frac1.imprimir;
[frac1 release]; // = frac1.release;
frac2.release; // = [frac2 release];
frac3.release; // Aunque no hayamos asignado un espacio en la memoria para frac3 en el programa principal, lo creamos en el metodo sumar, por lo cual se le debe hacer el 'release' (desasignarle el espacio en la memoria)
[pool drain];
return 0;
}