三十三、多态性、动态类型 和 动态绑定(六)关于物件类型的问题

来源:互联网 发布:python sys.read 编辑:程序博客网 时间:2024/05/21 18:46

如果  你  用  id类型的变量  来存储  物件,而  id类型的变量本身  可以存储  各种类型的物件,那么  很多时候  你  可能会问  这类的问题:

1、这个物件  属于  XX类型吗?

2、XX这项措施  适用于  这个物件吗?

3、这个物件所属的类别  是  包含  在XX这个类别当中,还是  就是  XX这个类别?

根据  这些问题的答案,你  可以执行  不同的代码,避免  错误,确保  程序的完整性。

下面这个表中的措施  适用于  所有属于NSObject类型的物件,可以帮助  你  搞清楚  上述的这类问题。

措施作用-(BOOL)isKindOfClass:class-object检查 措施的实施对象所属的类别 是否是 class类型,或者 包含 在class这个类型当中-(BOOL)isMemberOfClass:class-object检查 措施的实施对象所属的类别 是否是 class这个类型-(BOOL)respondsToSelector:selector检查 selector所代表的措施 是否适用于 实施对象+(BOOL)instancesRespondToSelector:selector检查 selector所代表的措施 是否适用于 属于措施实施者类型的物件(还记得 加号的含义吧?)+(BOOL)isSubclassOfClass:class-object检查 措施的实施者这类物件 是否包含 在class这类物件当中-(id)performSelector:selector实施 selector所代表的措施-(id)performSelector:selector withObject:object实施 selector所代表的措施,并且 附带object 作为参数-(id)performSelector:selector withObject:object1 withObject:object2实施 selector所代表的措施,并且 附带 object1 和 object2 作为参数

这个表  并不包含  所有的措施。

如果  你  需要根据物件类型的名称  生成  一个物件,你  只需要让  这类物件  采取  class这项措施  就可以了:

这行语句的作用  就是  生成  一个Square类型的物件。

如果  mySquare  是  一个物件的话,那么  你  可以用  class这项措施  知道  mySquare这个物件  属于  哪个类型,就像  这样:

同样的道理,如果  你  要判断  objectOne  和  objectTwo这两个变量中的物件  是否属于  同一个类型,你  只需要用到  下面这行语句:

如果  你  要判断  物件myFraction  是否属于  Fraction这个类型,你  可以用  这样的语句:

在上面的表格当中,我  提到过  selector。selector  可以理解为  措施标志。措施标志  有  两个意思:1、在源代码中,措施标志  就是  措施名称本身;2、在编译  源代码时  措施标志  是  用来代替措施名称的独一无二的标志。措施标志  可以存储  在SEL类型的变量中。

要生成  措施标志,可以使用  @selector命令,并且  将  措施的名称  作为  参数。比如  这行语句

就是  为  alloc这项措施  生成  措施标志。

下面这行语句  是  为  setNumerator:andDenominator:这项措施  生成  措施标志,注意  不能忘记  冒号,因为  这项措施  是  附带参数的:

检查  一项措施  是否适用于  某一类物件,我们  需要让  这类物件  实施instancesRespondToSelector:这项措施,instancesRespondToSelector:这项措施附带的参数  是  措施的标志。比如  这行语句

的作用  就是  检查  setNumerator:andDenominator:这项措施  是否适用于  Fraction类型的物件,而  检查的依据  是  setNumerator:andDenominator:这项措施的标志,而  不是  它本身。

另外  只要知道  一项措施的标志,我们  就可以  对  某个物件  采取  这项措施。在下面这段代码当中

我  创建了  一个SEL类型的变量action,并且  将  draw这项措施的标志  存储  在变量action当中。最后  我  对  graphicObject这个物件  采取了  performSelector:这项措施,并且  将  draw这项措施的标志action  作为参数  传递  给performSelector:这项措施。上述最后一行语句的效果  相当于  这样:

利用  performSelector:这项措施  和  需要实施的措施的标志  可以用来避免  错误:

在这段代码当中,我  先检查  变量action所代表的措施  是否适用于  graphicObject这个物件,如果  适用,则  实施  这项措施;如果  不适用,则  另行  处理。

下面这段程序  及  其运行结果  可以帮助  你  更好地  理解  上面表格中的措施:

运行后,可以得到  这样的结果:


原创粉丝点击