第五章Object-C类

来源:互联网 发布:中西方音乐文化知乎 编辑:程序博客网 时间:2024/06/14 13:08
*接口与实现文件
在这些时间里用你的类声明并且定义这些单独的文件。如果你用的是Xcode,你将要开始一个新的项目称为FractionTest。紧紧跟着这个项目文件是main.m
#import "Fraction.h"
int main(int argc,char* argv[])
{
    @autoreleasepool{
    Fraction *myFraction = [[Fraction alloc]init];
    [myFraction setNumerator:1];
    [myFraction setDenominator:3];
    NSLog(@"the value of myFraction is:");
    [myFraction print];
    }
    return 0;
}
这个文件并没有包含这个Fraction类。然而,它并没有输出文件称为Fraction.h。
通常情况下,一个类声明要产生它自己的文件,称为class.h。让我们推出这个类的声明Fraction.h以及定义这个Fraction.m。
Xcode将要增加两个文件在你的项目中:Fraction.h和Fraction.m.
#import "Fraction.h"
int main(int argc,char *argv[])
{
    @autoreleasepool{
    Fraction *myFraction = [[Fraction alloc]init];
    [myFraction setNumberator:1];
    [myFraction setDenominator:3];
    NSLog(@"The value of myFraction is:");
    [myFraction print];
    }
    return 0;
}
下面是文件Fraction.h
#import <Fraction/Fraction.h>
@interface Fraction:NSObject
-(void) print;
-(void) setNumerator:int(n);
-(void) setDenominator:(int)d;
-(int) numerator;
-(int) denominator;
-(double) convertToNum;
@end
接口文件告诉这个编译器有六个方法:print,setNumerator,setDenominator,numerator,denominator,以及convertToNum.
#import "Fraction.h"
@implementation Fraction
{
    int numerator;
    int denominator;
}
-(void)print
{
    NSLog(@"%i%i",numerator,denominator);
}
-(void) setNumerator:(int)n
{
    numerator = n;
}
-(void) setDenominator:(int)d
{
    denominator = d;
}
-(int) numerator
{
    return numerator;
}
-(int)denominator
{
    return denominator;
}
-(double) convertToNum
{
    if(denominator!=0)
    return (double)numerator/denominator;
    else
    return NAN;
}
@end

*语法合成方法
第一步是用这个@property检测你的接口来定义你自己的属性。这个属性同你命名的实例变量相同。在Fraction类中,这两个变量Numerator和denominator分类。新的接口部分由@property来增加。
@interface Fraction:NSObject
@property int numerator,denominator;
-(void) print;
-(double) convertToNum;
@end
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void)print
{
    NSLog(@"%i%i",numerator,denominator);
}
-(double)convertToNum
{
    if(denomanator != 0)
    return (double)numerator/denominator;
    else
    return NAN;
}
@end
*用点操作符
OC语言能够使你通过操作属性用更多方便的语法。来得到并且存储这个numerator值在myFraction,你能这样写下:
[myFraction numerator]
发送这个numerator信息给myFraction对象,来返回一个值。你能写一个相等的表达式用点操作符:
myFraction.numerator  通常的格式如下所示:
instance.property
你能用简单的语法来分配这些变量:
instance.property = value
紧接着写下下面的值:
[instance setProperty:value]
[myFraction setProperty:1];
[myFraction setDenominator:3];
这里有相等的方式来写下相同的两行:
myFraction.numerator = 1;
myFraction.denominator = 3;

我们能用新的语法特征方式并且访问这些属性。
下面我来看一下点操作符的用法。
#import "Fraction.h"
int main(int argc.char* argv[])
{
    @autoreleasepool{
    Fraction *myFraction = [[Fraction alloc]init];
    myFraction.numerator = 1;
    myFraction.denominator = 3;
    NSLog(@"the numerator is %i",myFraction.numerator);
    NSLog(@"the numerator is %i",myFraction.denominator);
    }
    return 0;
}
*多参数方式
让我们继续看下Fraction类并且增加一些其他东西。你需要定义六个方法。我们来设置这个numerator和denominator信息。你将要定义这些简单的方法在这些列表中。例如,这些方法名被称为addEntryWithName:andEmail:可以取两个参数,假设一个名一个是邮件地址。这个方法addEntryWithName:andEmail:andphone设置三个参数:name,email address以及一个手机号。代码如下:
[myFraction setNumerator:1 andDenominator:3];
让我们来用一个新的方法工作。首先增加这个生命setTo:over:to这个接口文件。
#import <Foundation/Foundation.h>
@interface Fraction:NSObject
@property int numerator,denominator;
-(void) print;
-(void) setTo:(int)n over:(int)d;
-(double) convertToNum;
@end
接下来,我们增加这个新的方法到实现文件中。
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
    NSLog(@"%i%i",numerator,denominator);
}
-(double)convertToNum
{
    if(denominator != 0)
    return (double)numerator/denominator;
    else
    return NAN;    
}
-(void)setTo:(int)n over:(int)d
{
    numerator = n;
    denominator = d;
}
@end
在这里我们测试一下新的方法。
#import "Fraction.h"
int main(int argc,char* argv[])
{
    @autoreleasepool{
    Fraction *myFraction = [[Fraction alloc]init];
    [aFraction setTo:1 over:3];
    [aFraction print];
    }
    return 0;
}
在Fractions中的操作
让我们假设你将要增加先前的一个声明以及一个定义的增加,最后增加测试用例到程序中。
@interface Fraction:NSObject
@property int numerator,denominator;
-(void) print;
-(void) setTo:(int)n over:(int) d;
-(double) convertToNum;
-(void) add:(Fraction*)f;
@end;
接下来看这些解释文件
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
    NSLog(@"%i%i",numerator,denominator);
}
-(double) convertToNum
{
    if(denominator != 0)
    return (double)numerato/denominator
    else
    return NAN;
}

-(void)setTo:(int)n over:(int)d
{
    numerator = n;
    denominator = d;
}
-(void)add:(Fraction*)f
{
    numerator = numerator*f.denominator+denominator*f.numerator;
    denominator = denominator*f.denominator;
}
@end

#import "Fraction.h"
int main(int argc,char *argv[])
{
    @autoreleasepool{
    Fraction* aFraction = [[Fraction alloc]init];
    Fraction* bFraction = [[Fraction alloc]init];
    
    [aFraction setTo:1 over:4];
    [bFraction setTo:1 over:2];
    [aFraction print];
    NSLog(@"+");
    [bFraction print];
    NSLog(@"=");
    [aFraction add:bFraction];
    [aFraction print];
    }
    return 0;
}
这个测试比较直接。这里面有两个Fractions,它们称为aFraction和bFraction,并且分配并且初始化。
*分配并且返回对象
-(Fraction*)add:(Fraction*)f
{
    Fraction *result = [[Fraction alloc]init];
    result.numerator = numerator*f.denominator +denominator*f.numerator;
    result.denominator = denominator*f.denominator;    
    [result reduce];
    return result;
}


0 0
原创粉丝点击