文档章节

OC多态,动态类型绑定

阿元
 阿元
发布于 2015/08/30 22:43
字数 1101
阅读 79
收藏 1
//
//  main.m
//  OC7类
//
//  Created by Zoujie on 15/8/23.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Fraction.h"//导入头文件
#import "Complex.h"


#define Choose  0
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        
        Fraction *myFraction = [Fraction new];
        if (Choose)
        {
//          [myFraction setNumberator1:11];
            myFraction.denominator1 = 11;
//          [myFraction setDenominator1:3];
        myFraction.numberator1 = 3;
        }
        else
        {
            [myFraction setNumberator1:1 Denominator:7];
        }
        NSLog(@"The value of myFraction");
        [myFraction print];
        NSLog(@"The value of myFranction:%i/%i",myFraction.numberator1,myFraction.denominator1);
        
        
//   add        传入对象参数
        Fraction *afraction = [Fraction new];
        Fraction *bfraction = [Fraction new];
        
        [afraction setNumberator1:1 Denominator:4];
        [bfraction setNumberator1:1 Denominator:2];
        
        [afraction print];
        NSLog(@"+");
        [bfraction print];
        NSLog(@"=");
//        
//        [afraction add:bfraction];
//        [afraction print];
//        
////        reduce 分数相约到最简形式
//        [afraction reduce];
//        [afraction print];
//        
//        在方法中分配和返回对象
        Fraction *resultFraction;
        resultFraction = [afraction newAdd:bfraction];
        [resultFraction print];
        
        Fraction *subRusult = [bfraction subtract:afraction];
        [subRusult print];
        
        
//        多态  不同类使用相同方法
        Fraction *f1 = [Fraction new];
        Fraction *f2 = [Fraction new];
        Fraction *fracResult;
        
        Complex *c1 = [Complex new];
        Complex *c2 = [Complex new];
        Complex *complexResult;
        
//        [f1 setTo:1 over:10];
        [f1 setNumberator1:1 Denominator:10];
        [f2 setNumberator1:2 Denominator:15];
        
        [c1 setReal:18.0 andImaginary:2.5];
        [c2 setReal:-5.0 andImaginary:3.2];
        
        [c1 print]; NSLog(@" +");[c2 print];
        NSLog(@"------------");
        complexResult = [c1 add:c2];
//        [complexResult reduce];
        [complexResult print];
        NSLog(@"\n");
        
//        将两个分数相加的显示
        [f1 print];NSLog(@"  +");[f2 print];
        NSLog(@"----");
        fracResult = [f1 newAdd:f2];
        [fracResult print];
        
        
//        id 可以用来存储属于任何类的对象
        id dataValue;
        NSLog(@"---------------id类型");
        dataValue = f1;
        [dataValue print];
        
        dataValue = c1;
        [dataValue print];
        
//
//        self.dataValue; //id变量无法使用点运算符
//        处理动态类型的方法
       
        if ([dataValue isKindOfClass:[Complex class]])//对象是不是Complex或其子类的成员,继承层次关系
        {
            NSLog(@"dataValue 's SuperClass is %@",[dataValue class]);
        };
        
        if ([dataValue isMemberOfClass:[Complex class]]){};//对象是不是Complex的成员,直接成员关系
        if ([f1 respondsToSelector:@selector(setReal:andImaginary:)]){};//对象是否能够响应selector所指定的方法
        if ([dataValue instancesRespondToSelector:@selector(setReal:andImaginary:)]){};//指定的类实例是否能响应selector
        if ([dataValue isSubclassOfClass:[Complex class]]){};//对象是否是指定类的子类
        
        [dataValue performSelector:@selector(setValue:forKey:)];//应用selector指定的方法
        [dataValue performSelector:@selector(setNumberator1:Denominator:) withObject:f1];//使用selector指定的方法,传递参数
        [dataValue performSelector:@selector(setNumberator1:Denominator:) withObject:f1 withObject:f2];
        
        //使用@try处理异常
        Fraction *f = [Fraction new];
//        [f noSuchMethod];
        NSLog(@"Execution continues");
        @try {
//            [f setReal:18.0 andImaginary:2.5];
        }
        @catch (NSException *exception) {
            NSLog(@"Caught %@%@",[exception name],[exception reason]);
        }
        @finally {
           NSLog(@"Execution continues");
        }
        
    }
    return 0;
}
//
//  Fraction.h
//  OC7类
//
//  Created by Zoujie on 15/8/23.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import <Foundation/Foundation.h>
//接口文件
@interface Fraction : NSObject

#pragma mark - 属性 自动生成 Setter && Get
@property  int numberator1;
@property  int denominator1;
#pragma mark - Setter && Get
//-(void)setNumerator:(int)n;
//-(void)setDenominator:(int)d;
//-(int)numerator;
//-(int)denominator;
-(double) convertToNum;
-(void)print;

/**
 *  多参数函数
 */
-(void)setNumberator1:(int) n Denominator:(int)d;

/**
 *  add
 */
-(void) add:(Fraction *)f;

/**
 *  相约数
 */
-(void) reduce;

/**
 *  记数
 */
-(int)showpage;

/**
 *  new add
 */
-(Fraction *) newAdd:(Fraction *)f;

/**
 *  减去消息接受着的参数
 */
-(Fraction *) subtract :(Fraction *)f;

/**
 *  乘
 */
-(Fraction *) multiply :(Fraction *) f;

/**
 *  除
 */
-(Fraction *) divide :(Fraction *)f;
@end
//
//  Fraction.m
//  OC7类
//
//  Created by Zoujie on 15/8/23.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import "Fraction.h"//双引号实用于本地文件(自己创建的文件),而不是系统文件
//实现文件  实现部分包含的私有信息

/**
 *  static 关键字 局部静态变量 记录所有对象调用函数的次数    局部变量 只记录每个对象自己调用函数的次数
 */
static int hitCount = 0;//调用次数

@implementation Fraction
//{
//    int numberator;
//    int denominator;
//}

/**
 *  如果省略@synthesize指令,那么编译器会自动分别命名底层的实例变量_numberator1,_denominator1.
 */
@synthesize numberator1,denominator1;

//-(void) setNumerator:(int)n
//{
//    numberator = n;
//}
//
//-(void) setDenominator:(int)d
//{
//    denominator = d;
//}

//********setter getter的参数名 不要跟 实例名称 相同 *********
-(void)setNumberator:(int)numberator
{
    numberator1 = numberator;
}

-(void) setDenominator:(int)denominator
{
    denominator1 = denominator;
}
//-(void) setDenominator:(int)denominator //自动生成Setter
//{
//    denominator = denominator;
//}
-(int)numerator
{
    return numberator1;
}

-(int)denominator
{
    return denominator1;
}

-(void)print
{
        NSLog(@"%i/%i",numberator1,denominator1);
}

-(double)convertToNum
{
    if (denominator1 != 0)
    {
        return (double) numberator1 / denominator1;
    }
    else
    {
        return NAN;
    }
}

-(void)setNumberator1:(int)n Denominator:(int)d
{
    denominator1 = d;
    numberator1 = n;
}

-(void) add:(Fraction *)f
{
    numberator1 = numberator1 * f.denominator1 +denominator1 *f.numberator1;
    denominator1 = denominator1 * f.denominator1;
    
//    self 关键字   当前方法的接受着
    [self reduce];
}
/*
 *  new add
 */
-(Fraction *) newAdd:(Fraction *)f
{
    Fraction *result = [Fraction new];
    
    result.numberator1 = numberator1 * f.denominator1 + denominator1 * f.numberator1;
    result.denominator1 = denominator1 * f.denominator1;
    
    [result reduce];
    
    return result;
}
/**
 *  sub
 */
-(Fraction *) subtract:(Fraction *)f
{
    Fraction *result = [Fraction new];
    
    result.numberator1 = numberator1 * f.denominator1 - denominator1 * f.numberator1;
    result.denominator1 = denominator1 * f.denominator1;
    
    [result reduce];
    
    return result;
}
-(void) reduce
{
//局部变量
    int u = numberator1;
    int v = denominator1;
    int temp;
    
    while (v != 0) {
        temp = u % v;
        u = v ;
        v = temp ;
    }
    numberator1 /= u;
    denominator1 /= u;
}

-(int)showpage
{
    int hitCount = 0;
    hitCount ++;
    return hitCount;
}
@end
//
//  Complex.h
//  OC7类
//
//  Created by Zoujie on 15/8/30.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

/**
 *  多态,动态类型,动态绑定  
 *  使不同的类共享相同的方法名称的能力称为多态
 */
#import <Foundation/Foundation.h>

@interface Complex : NSObject

@property double real,imaginary;

-(void)print;
-(void)setReal:(double)a andImaginary:(double)b;
-(Complex *) add:(Complex *)f;
@end
//
//  Complex.m
//  OC7类
//
//  Created by Zoujie on 15/8/30.
//  Copyright (c) 2015年 Zoujie. All rights reserved.
//

#import "Complex.h"

@implementation Complex
@synthesize real,imaginary;

-(void)print
{
    NSLog(@"%g + %gi",real,imaginary);
}

-(void) setReal:(double)a andImaginary:(double)b
{
    real = a ;
    imaginary = b;
}

-(Complex *)add:(Complex *)f
{
    Complex *result = [[Complex alloc]init];
    result.real = f.real+real;
    result.imaginary = f.imaginary + imaginary;
    return result;
    
}
@end


© 著作权归作者所有

上一篇: OC变量数据类型
下一篇: OC继承
阿元
粉丝 5
博文 163
码字总数 109777
作品 0
浦东
程序员
私信 提问
【Objective-C】Objective-C语言的动态性

  Objective-C语言的动态性主要体现在以下3个方面   (1)动态类型:运行时确定对象的类型。   (2)动态绑定:运行时确定对象的方法。   (3)动态加载:运行时加载需要的资源或者或...

零零圈圈
06/19
0
0
【非凡程序员】 OC第四节课 (复合和多态)

1.复合:是将各个部分组合在一起。程序设计中就是用已有类的对象来产生新的类。 编程中的复合就是将多个组件组合在一起,配合使用,从而得到完整的作品。 发动机是汽车的组成部分 -> 复合 飞...

七月流火zsp
2015/05/17
46
0
简单说说面试

本文包括: OC的面向对象 运行时Runtime 运行循环RunLoop 事件响应链 引用计数 生命周期 与其他语言的区别 Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对...

天机
2016/08/17
33
0
java基础-多态是什么?

1.1 什么是多态? 多态是继数据抽象和继承之后的第三种基本特征。 定义:多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用C...

KongFanhao
2016/09/18
47
0
Objective-C原理系列(一)

Objective-C 简称OC(下面以此代称),是在C语言的基础上,增加了一层最小的面向对象语言。是一种静态输入的语言,即“必须先声明数据中每个变量(或者容器)的数据类型”。但它是一个动态语...

FTD_SL
2016/08/17
52
0

没有更多内容

加载失败,请刷新页面

加载更多

经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0
实战项目-学成在线(八)

在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中心来管理微服务信息。 注册中心作用: 1、微服务数量众多,要进行远程调用就需要知...

lianbang_W
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部