obj-c编程05:类的多态与id动态绑定
说实在的,写这第5篇的时候十分纠结,代码老是不能动态绑定,在编译时就会出错,最后发现这是开了ARC的原因。开了ARC obj-c就不能动态绑定了吗?这个问题还不清楚哦。把ARC关闭后,虽然会有警告,但运行是正确的。下面上代码:
#import <Foundation/Foundation.h>
@interface A:NSObject{
double i;
}
@property double i;
-(double)mul:(double)x;
-(void)show;
@end
@implementation A
@synthesize i;
-(double)mul:(double)x{
return i * x;
}
-(void)show{
NSLog(@"[A obj]i : %f",i);
}
@end
@interface B:NSObject{
int i;
}
@property int i;
-(int)mul:(int)x;
-(void)show;
@end
@implementation B
@synthesize i;
-(int)mul:(int)x{
return i * x;
}
-(void)show{
NSLog(@"[B obj]i : %d",i);
}
@end
int main(int argc,char *argv[])
{
@autoreleasepool{
NSLog(@"hello obj-c!");
//A *a = [[A alloc] init];
//id obj = a;
id obj = [[A alloc] init];
[obj setI:123.123];
//[obj mul:123];
[obj show];
NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);
}
return 0;
}
这是开了ARC之后的编译,无法动态绑定鸟:
apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation 2.m -o 2
2.m:52:3: error: multiple methods named 'setI:' found with mismatched result,
parameter type or attributes
[obj setI:123.123];
^~~~~~~~~~~~~~~~~~
2.m:6:19: note:
one possibility
@property double i;
^
2.m:26:16: note: also found
@property int i;
^
2.m:55:26: error: multiple methods named 'i' found with mismatched result,
parameter type or attributes
NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);
^~~~~~~
2.m:6:19: note:
one possibility
@property double i;
^
2.m:26:16: note: also found
@property int i;
^
2.m:55:40: error: multiple methods named 'mul:' found with mismatched result,
parameter type or attributes
NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);
^~~~~~~~~~~~~~~
2.m:7:2: note:
one possibility
-(double)mul:(double)x;
^~~~~~~~~~~~~~~~~~~~~~~
2.m:28:2: note:
also found
-(int)mul:(int)x;
^~~~~~~~~~~~~~~~~
3 errors generated.
这是关了ARC之后的编译和运行:
apple@kissAir: objc_src$clang -framework Foundation 2.m -o 2
2.m:52:3: warning: multiple methods named 'setI:' found
[obj setI:123.123];
^~~~~~~~~~~~~~~~~~
2.m:6:19: note: using
@property double i;
^
2.m:26:16: note: also found
@property int i;
^
2.m:55:26: warning: multiple methods named 'i' found
NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);
^~~~~~~
2.m:6:19: note: using
@property double i;
^
2.m:26:16: note: also found
@property int i;
^
2.m:55:40: warning: multiple methods named 'mul:' found
NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);
^~~~~~~~~~~~~~~
2.m:7:2: note: using
-(double)mul:(double)x;
^~~~~~~~~~~~~~~~~~~~~~~
2.m:28:2: note:
also found
-(int)mul:(int)x;
^~~~~~~~~~~~~~~~~
3 warnings generated.
apple@kissAir: objc_src$./2
2014-06-30 08:51:28.972 2[828:507] hello obj-c!
2014-06-30 08:51:28.974 2[828:507] [A obj]i : 123.123000
2014-06-30 08:51:28.974 2[828:507] 123.123000 * 99.990000 is 12311.068770
这个问题还没得到解决,希望哪位高人给予解答一下,在这之前我先跳过往后学鸟
,毕竟时间不等笨猫啊!
[2014-07-05 第1次新增]:多态的第二个例子
我们来看看一个简单的代码,其正确实现了对象的多态功能,虽然编译时会有警告:
int main(int argc, char *argv[]){
@autoreleasepool {
msg(@"Hello World!");
NSString *str = @"hello apple";
NSObject *obj = str;
id item = str;
msg(@"%lu %lu",[obj length],[item length]);
}
return 0;
}
编译运行如下:
wisy@wisy-ThinkPad-X61:~/src/objc_src$ clang -objc-arc -O3 -g0 $OBJC_OPTS -lobjc -lgnustep-base -o 1 1.m
1.m:12:23: warning: 'NSObject' may not respond to 'length'
msg(@"%lu %lu",[obj length],[item length]);
~~~ ^
1.m:3:24: note: expanded from macro 'msg'
#define msg(...) NSLog(__VA_ARGS__)
^
1 warning generated.
wisy@wisy-ThinkPad-X61:~/src/objc_src$ ./1
2014-07-05 09:45:58.092 1[3309] Hello World!
2014-07-05 09:45:58.095 1[3309] 11 11
前面一个问题答案貌似也清楚了,类B没有从A继承啊!你从NSObject继承,当运行时动态绑定的对象自然不知道到底是调用A还是B对象的方法鸟.
obj-c编程05:类的多态与id动态绑定的更多相关文章
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
- 并发编程 05—— Callable和Future
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- C# 类的多态、结构、接口、抽象、虚函数总结
多态: 类的多态是通过在子类(派生类)中重载基类的虚方法或成员函数来实现的. 可见,重载和虚函数的重写,并在调用时用父类装箱子类对象,是实现多态的一种重要的编程方式. 接口: 接口是一种用来定义程序的 ...
- day21-5 类的多态与多态性
类的多态与多态性 多态 多态指的是一类事物有多种形态,如动物有多种形态:人.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物 ...
- Python全栈开发之7、面向对象编程进阶-类属性和方法、异常处理和反射
一.类的属性 1.@property属性 作用就是通过@property把一个方法变成一个静态属性 class Room: def __init__(self,name,length,width,he ...
- day18-Python运维开发基础(单继承 / 多继承 / 菱形继承、类的多态)
1. 单继承 / 多继承 / 菱形继承 # ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 """ 一个类可以继承另外一个类,那 ...
- Python类的多态的例子
1 # -*- coding: utf-8 -*- 2 # 类的多态 3 4 # 定义Person父类 5 class Person(object): 6 def __init__(self, nam ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- Python 类的多态的运用
#类的多态的运用 #汽车类 class Car(object): def move(self): print("move ...") #汽车商店类 class CarStore(o ...
随机推荐
- 【移动开发】plurals
不同的语言对数量的语法规定有不同的规则.在英语里面,例如,1是特例.我们会直接写1book,而针对一个以上的我们会在book后加复数形式.这种区别对单数和复数来说是很普遍的,但是其他的语言做了更好的区 ...
- 海量并发的无锁编程 (lock free programming)
最近在做在线架构的实现,在线架构和离线架构近线架构最大的区别是服务质量(SLA,Service Level Agreement,SLA 99.99代表10K的请求最多一次失败或者超时)和延时.而离线架 ...
- Dynamics CRM2015 非基础语言环境下产品无法新建的问题
该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查 ...
- 【Unity Shaders】Unity里的雾效模拟
写在前面 熟悉Unity的都知道,Unity可以进行基本的雾效模拟.所谓雾效,就是在远离我们视角的方向上,物体看起来像被蒙上了某种颜色(通常是灰色).这种技术的实现实际上非常简单,就是根据物体距离摄像 ...
- Cocos2D两个方法的重构一例
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在RPG游戏项目的GameSpace类中原来有一个方法: -( ...
- 解析JSON的三种方式
JSONObject JSONObject jsonObject = new JSONObject(strJson); JSONArray jsonArray = jsonObject.getJS ...
- Docker教程:dokcer machine的概念和安装
http://blog.csdn.net/pipisorry/article/details/50920982 Docker machine介绍 做为Docker容器集群管理三剑客之一的Docker ...
- 《java入门第一季》之HashSet存储自定义对象问题以及注意事项
上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存 ...
- 中国电信中兴F460光猫破解及路由级联设置
http://blog.csdn.net/pipisorry/article/details/50636541 中国电信中兴F460光猫破解,获取超级密码,修改配置. 之前家里的宽带升级了,换成了光纤 ...
- 《java入门第一季》之UDP协议下的网络编程小案例
需求,一台电脑发送数据,其他电脑都可以收到该数据.使用广播地址. 发送端: import java.io.BufferedReader; import java.io.IOException; imp ...