您的位置:首页 > 其它

id类型、动态判断与选择器

2012-06-27 21:01 155 查看
1、id类型

[plain]
view plaincopyprint?

// Complex.h==============================
#import <Foundation/Foundation.h>

@interface Complex : NSObject{
double real;
double imageinary;
}

-(Complex*) initWithReal:(double) r andImageinary:(double)i;
-(void)setReal:(double) r;
-(void)setImaginary:(double) i;
-(void)setReal:(double)r andImaginary:(double) i;
-(double)real;
-(double)imaginary;
-(void)print;
@end

// Complex.h==============================
#import "Complex.h"

@implementation Complex
-(Complex*) initWithReal:(double) r andImageinary:(double)i;
{
self = [super init];
if(self){
[self setReal:r andImaginary:i];
}
return self;
}

-(void)setReal:(double) r{
real = r;
}

-(void)setImaginary:(double) i{
imaginary = i;
}

-(void)setReal:(double)r andImaginary:(double) i{
real = r;
imaginary = i;
}

-(double)real{
return real;
}

-(double)imaginary{
return imaginary;
}

-(void)print{
NSLog(@"%f + %fi",real,imaginary);
}
@end
// main.m==============================
#import "Fraction.h"
#import "Complex.h"

int main(argc,const char * argv[]){
Fracion *frac = [[Fraction alloc] intiWithNumerator:3 andDenominator:5];
Complex *comp = [[Complex alloc] initWithReal:1.5 andImaginary:3.5];

id number = frac;
[number print];

number = comp;
[comp print];

[frc release];
[comp release];
return 0;
}

[java] 
view plaincopyprint?

@import "MySquare.h"  
int main(argc,const char * argv[]){  
    MyRectangle *rec = [[MyRectangle alloc] initWithWidth:2 andHeight:5];  
    [rec area];  
    MySquare *squa = [[MySquare alloc] initWithSize:6];  
    [squa area];  
    //判断对象是否是clazz的实例,不包含子类的实例
  
    if([squa isMemberOfClass:[MyRectangle class]]){  
        NSLog(@"squa isMemberOfClass MyRectangle.");  
    }else{  
        NSLog(@"squa not isMemberOfClass MyRectangle.");  
    }  
  
    if([squa isKindOfClass:[MySquare class]]){  
        NSLog(@"squa isKindOfClass MySquare.");  
    }else{  
        NSLog(@"squa not isKindOfClass MySquare.");  
    }  
    //判断对象是否是clazz的实例或者子类的实例
  
    if([squa isKindOfClass:[MyRectangle class]]){  
        NSLog(@"squa isKindOfClass MyRectangle.");  
    }else{  
        NSLog(@"squa not isKindOfClass MyRectangle.");  
    }  
  
    if([squa isKindOfClass:[MySquare class]]){  
        NSLog(@"squa isKindOfClass MySquare.");  
    }else{  
        NSLog(@"squa not isKindOfClass MySquare.");  
    }  

@import "MySquare.h"
int main(argc,const char * argv[]){
	MyRectangle *rec = [[MyRectangle alloc] initWithWidth:2 andHeight:5];
	[rec area];
	MySquare *squa = [[MySquare alloc] initWithSize:6];
	[squa area];
	//判断对象是否是clazz的实例,不包含子类的实例
	if([squa isMemberOfClass:[MyRectangle class]]){
		NSLog(@"squa isMemberOfClass MyRectangle.");
	}else{
		NSLog(@"squa not isMemberOfClass MyRectangle.");
	}

	if([squa isKindOfClass:[MySquare class]]){
		NSLog(@"squa isKindOfClass MySquare.");
	}else{
		NSLog(@"squa not isKindOfClass MySquare.");
	}
	//判断对象是否是clazz的实例或者子类的实例
	if([squa isKindOfClass:[MyRectangle class]]){
		NSLog(@"squa isKindOfClass MyRectangle.");
	}else{
		NSLog(@"squa not isKindOfClass MyRectangle.");
	}

	if([squa isKindOfClass:[MySquare class]]){
		NSLog(@"squa isKindOfClass MySquare.");
	}else{
		NSLog(@"squa not isKindOfClass MySquare.");
	}


[java]
view plaincopyprint?

//判断对象或类型是否有能力回应指定方法

if([squa respondsToSelector:@selector(initWithSize:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}

if([MySquare respondsToSelector:@selector(alloc)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}

if([rec respondsToSelector:@selector(initWithWidth:andHeight:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}

//判断类产生的实例是否有能力回应指定的方法

if([MySquare instanceRespondsToSelector:@selector(initWithSize:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([MySquare instanceRespondsToSelector:@selector(alloc:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}

//动态调用类或者对象上的一个方法

id x_id = [rec performSelector:@selector(area)];
[MyRectangle performSelector:@selector(alloc)];

[rec release];
[squa release];

[plain] 
view plaincopyprint?

//FractionMath.h=====================================  
#import "Fraction.h"  
  
@interface Fraction(Math1)  
  
-(Fraction*)mul:(Fraction*)f;//乘法,就是传入一个Fraction作为参数,与当前Fraction进行计数  
-(Fraction*)div:(Fraction*)f;//除法  
@end  
  
@interface Fraction(Math2)  
-(Fraction*)add:(Fraction*)f;  
@end  
//FractionMath.m =======================================  
#import "Fraction.h"  
@implementation Fraction(Math1)  
  
-(Fraction*)mul:(Fraction*)f{  
    return [[Fraction alloc] initWithNumerator:numerator *[f numerator]  
                       denominator:denominator*[f denominator]];  
}  
-(Fraction*)div:(Fraction*)f{  
    return [[Fraction alloc] initWithNumerator:numerator *[f denominator]  
                       denominator:denominator*[f numerator]]  
}  
  
@end  
@implementation Fraction(Math2)  
  
-(Fraction*)add:(Fraction*)f{  
    return [[Fraction alloc] initWithNumerator:  
        numerator *[f denominator] + denominator*[f numerator]  
        denominator:denominator*[f denominator]];  
}  
  
@end  
//main.m======================================  
#import "FractionMath.h"  
int main(int argc,const char *argv[]){  
    Fraction *frac1 = [[Fraction alloc] initWithNumerator:1 denominator:3];  
    Fraction *frac2 = [[Fraction alloc] initWithNumerator:2 denominator:5];  
  
    Fraction *frac3 = [[frac1 mul:frac2];  
    [frac1 print];  
    NSLog(@"*");  
    [frac2 print];  
    NSLog(@"=");  
    [frac3 print];  
    NSLog(@"\n");  
  
    Fration *frac5 = [frac1 add:frac2];  
    [frac2 print];  
    NSLog(@"+");  
    [frac2 print];  
    NSLog(@"=");  
    [frac2 print];  
    NSLog(@"\n");  
  
    [frac1 release];  
    [frac2 release];  
    [frac3 release];  
    [frac5 release];  
    return 0;  
}  

//FractionMath.h=====================================
#import "Fraction.h"

@interface Fraction(Math1)

-(Fraction*)mul:(Fraction*)f;//乘法,就是传入一个Fraction作为参数,与当前Fraction进行计数
-(Fraction*)div:(Fraction*)f;//除法
@end

@interface Fraction(Math2)
-(Fraction*)add:(Fraction*)f;
@end
//FractionMath.m =======================================
#import "Fraction.h"
@implementation Fraction(Math1)

-(Fraction*)mul:(Fraction*)f{
	return [[Fraction alloc] initWithNumerator:numerator *[f numerator]
				       denominator:denominator*[f denominator]];
}
-(Fraction*)div:(Fraction*)f{
	return [[Fraction alloc] initWithNumerator:numerator *[f denominator]
				       denominator:denominator*[f numerator]]
}

@end
@implementation Fraction(Math2)

-(Fraction*)add:(Fraction*)f{
	return [[Fraction alloc] initWithNumerator:
		numerator *[f denominator] + denominator*[f numerator]
		denominator:denominator*[f denominator]];
}

@end
//main.m======================================
#import "FractionMath.h"
int main(int argc,const char *argv[]){
	Fraction *frac1 = [[Fraction alloc] initWithNumerator:1 denominator:3];
	Fraction *frac2 = [[Fraction alloc] initWithNumerator:2 denominator:5];

	Fraction *frac3 = [[frac1 mul:frac2];
	[frac1 print];
	NSLog(@"*");
	[frac2 print];
	NSLog(@"=");
	[frac3 print];
	NSLog(@"\n");

	Fration *frac5 = [frac1 add:frac2];
	[frac2 print];
	NSLog(@"+");
	[frac2 print];
	NSLog(@"=");
	[frac2 print];
	NSLog(@"\n");

	[frac1 release];
	[frac2 release];
	[frac3 release];
	[frac5 release];
	return 0;
}


注意:

类别不可以声明新的实例变量,而且一旦你定义的方法与原始类中的方法名相同,那么原始方法将被隐藏起来

因为不是继承结构,你不能在类别中的方法使用super激活原始类的同名方法

类别还有一个功能,就是隐藏方法,我们在Fraction.m的最后增加如下方法

@interface Fraction(Math3)

-(Fraction*)sub:(Fraction*)f;//减法

@end

@implementation Fraction(Math3)

-(Fraction*)sub:(Fraction*)f{

return [[Fraction alloc] initWithNumerator:

numerator*[f denominator]-denominator*[f numerator]

denominator:denominator*[f denominator]];

}

@end

在。m文件中定义@interface?是的,因为@interface一旦定义在。m文件中,它就不能以header文件形式被导入到其他的类里了,

也就是这样的@interface中定义的方法相当于隐藏了,只有zhege。m编译单元内看见

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: