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对象的方法鸟.

时间: 2024-10-02 21:45:05

obj-c编程05:类的多态与id动态绑定的相关文章

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

后台开发:核心技术与应用实践2.3 类的多态

2.3 类的多态 1.?多态 多态,顾名思义,是一个事物有多种形态的意思.在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数.在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法):也就是说,每个对象可以用自己的方式去响应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数. [例2.28] 基类和派生类成员函数同名覆盖时的执行选择. #include<

C#体验编程技术 类与对象

编程|对象 组件编程不是对传统面向对象的抛弃,相反组件编程正是面向对象编程的深化和发展.类作为面向对象的灵魂在C#语言里有着相当广泛深入的应用,很多非常"Sharp"的组件特性甚至都是直接由类包装而成.对类的深度掌握自然是我们"Sharp XP"重要的一环. 类 C#的类是一种对包括数据成员,函数成员和嵌套类型进行封装的数据结构.其中数据成员可以是常量,域.函数成员可以是方法,属性,索引器,事件,操作符,实例构建器,静态构建器,析构器.我们将在"第五讲 构

obj-c编程04:类的继承

    这第4篇内容比较少,主要说的是obj-c中的类的继承,需要说明的是我只是写了继承中最简单的形式,如果全部展开来说,那就多了去了!关键是现在肚子里还没装够墨水,没法展开啊!     下面的代码中,我们写了2个类:父类A和子类B,然后B中对A中的方法做了重写. #import <Foundation/Foundation.h> @interface A:NSObject{ int i; } @property int i; -(void)print; @end @implementatio

编程-String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?

问题描述 String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1? 如题,这是代码: String s = ""A1B2C3D4E5F6G7H8""; String[] b = new String[8]; System.out.println(""b:"" + b.length); b = s.split(""[A-Z]""); System.out.

编程-数组类模板Array,类中包括对数组进行排序、查找和求元素和 然后由此产生模板类Array&amp;amp;lt;Box&amp;amp;gt;

问题描述 数组类模板Array,类中包括对数组进行排序.查找和求元素和 然后由此产生模板类Array<Box> #include using namespace std;class Box{private: int a b c;public: int V; Box(int chint kint g) { a = ch; b = k; c = g; V = a*b*c; } bool operator <(Box &one) { int temp = V - one.V; if (

Python 进阶_OOP 面向对象编程_类属性和方法

目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象的属性,需要在类中使用 self 关键字来将其和实例化对象绑定的属性. 2. 函数属性:指的是定义在函数体内的属性,其可以是实例属性,也可以是类属性. 3. 类属性:是一个与实例无关的属性,比起实例属性而言,它更加的 静态,当定义在类方法中时,并不会因为方法调用的完毕而被回收.类属性,在类定义中直接

Python 进阶_OOP 面向对象编程_类和继承

目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类属性方法的命名规则 类 类是实例的抽象, 实例是类的具体化. Python 中的类分为 经典类 和 新式类. 前者现在已经很少用到了, 其特点就是可以不需要继承任何父类:后者则刚好相反, 形式类必须至少有一个父类, 如果没有特定的父类需要继承时, 至少需要继承基类 object, 在后面给出例子.

Python OOP知识积累

前言 Python是一个功能非常强大的编程语言.玩法很多.但是在我们享受Python带来的编程乐趣之前,我们必须要掌握OOP编程技能,这样才能够更好的应用Python高级功能.OOP我曾经在<Python_基础知识储备>中提到过,这次我们再全面而详细的回炉一次. 对象 在计算机领域中,对象是人们要进行研究的任何事物,它表示具体的事物,此外也表示抽象的规则.计划或事件.对象是数据和操作数据的方法的结合. 对象的状态(数据):一个对象用数据值来描述它的状态,也称为对象属性. 对象的行为(操作):对