OC分类和协议

//
//  ViewController.m
//  OC11分类和协议
//
//  Created by Zoujie on 15/9/13.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import "ViewController.h"
#import "Fraction.h"
#import "GraphicObject.h"
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>//协议
{
    id currentObject;
}


@end
id <Drawing> currentObject;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
// 分类
    Fraction *a = [Fraction new];
    Fraction *b = [Fraction new];
    Fraction *result;
    Fraction *tempFraction = [Fraction new];
    Fraction *intvertResult = [Fraction new];
    
    [a setTo:1 over:3];
    [b setTo:2 over:5];
    
    [a print]; NSLog(@"    +");[b print];NSLog(@"-----");
    result = [a add:b];
    [result print];
    NSLog(@"\n");
    
    [a print]; NSLog(@"    -");[b print];NSLog(@"-----");
    result = [a sub:b];
    [result print];
    NSLog(@"\n");
    
    [a print]; NSLog(@"    *");[b print];NSLog(@"-----");
    result = [a mul:b];
    [result print];
    NSLog(@"\n");
    
    [a print]; NSLog(@"    /");[b print];NSLog(@"-----");
    result = [a div:b];
    [result print];
    NSLog(@"\n");
    
    NSLog(@"----------------------------------");
    intvertResult  = [tempFraction invert:result];//对象接受  返回值   (小坑)
    [intvertResult print];
    NSLog(@"\n");
    
//    协议 代理
    
    if ([currentObject conformsToProtocol:@protocol(Drawing)] == YES)//conformsToProtocol 检查某个方法是否遵循某项协议
    {
        [currentObject outline];
    };
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

//
//  GraphicObject.h
//  OC11分类和协议
//
//  Created by Zoujie on 15/9/13.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol Drawing//协议名称
-(void) paint;
-(void) erase;

@optional//可选择是否实现
-(void) outline;
@end

@interface GraphicObject : NSObject <Drawing>


@end

//
//  GraphicObject.m
//  OC11分类和协议
//
//  Created by Zoujie on 15/9/13.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import "GraphicObject.h"

@implementation GraphicObject


@end

//
//  Fraction.h
//  OC11分类和协议
//
//  Created by Zoujie on 15/9/13.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;


-(void) setTo:(int) n over:(int) d;
//-(Fraction *) add:(Fraction *) f;
-(void) reduce;
-(double) convertToNum;
-(void) print;
@end

//分类
#import "Fraction.h"

@interface Fraction (MathOps)//为Fraction类定义新的分类,名称为MathOps

-(Fraction *) add:(Fraction *)f;
-(Fraction *) mul:(Fraction *)f;
-(Fraction *) sub:(Fraction *)f;
-(Fraction *) div:(Fraction *)f;
//11.5
-(Fraction *) invert:(Fraction *)f;//结果倒置
@end

//
//  Fraction.m
//  OC11分类和协议
//
//  Created by Zoujie on 15/9/13.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import "Fraction.h"

@implementation Fraction

-(void)setTo:(int)a over:(int)b
{
    _numerator = a;
    _denominator = b;
    
}

-(void)print
{
    NSLog(@"%d/%d",_numerator,_denominator);
}

-(void) reduce
{
    //局部变量
    int u = _numerator;
    int v = _denominator;
    int temp;
    
    while (v != 0) {
        temp = u % v;
        u = v ;
        v = temp ;
    }
    _numerator /= u;
    _denominator /= u;
}

-(double)convertToNum
{
    if (_denominator != 0)
    {
        return (double) _numerator / _denominator;
    }
    else
    {
        return NAN;
    }
}
@end

@implementation Fraction (MathOps)

//相加
-(Fraction *) add:(Fraction *)f
{
    Fraction *result = [Fraction new];
    result.numerator = (_numerator *f.denominator) + (_denominator * f.numerator);
    result.denominator = _denominator * f.denominator;
    [result reduce];
    return result;
}

//相减
-(Fraction *) sub:(Fraction *)f{
    Fraction *result = [Fraction new];
    result.numerator = (_numerator * f.denominator) - (_denominator *f.numerator);
    result.denominator = _denominator *f.denominator;
    [result reduce];
    return result;
}
//相乘
-(Fraction *) mul:(Fraction *)f{
    Fraction *result = [Fraction new];
    result.numerator = _numerator *f.numerator;
    result.denominator = _denominator *f.denominator;
    [result reduce];
    return result;
}
//相除
-(Fraction *) div:(Fraction *)f{
    Fraction *result = [Fraction new];
    result.numerator = _numerator *f.denominator;
    result.denominator  = _denominator * f.numerator;
    [result reduce];
    return result;
}

//结果倒置
-(Fraction *) invert:(Fraction *)f
{
    Fraction *result = [Fraction new];
    result.numerator = f.denominator ;
    result.denominator = f.numerator;
    [result reduce];
    return result;
}















@end


你可能感兴趣的:(OC分类和协议)