Objective-C 多态

本文详细介绍了Objective-C中的多态概念及其应用,包括不同对象如何以自己的方式响应相同名称的方法,并探讨了静态绑定与动态绑定的区别。此外,还介绍了如何使用类方法来判断对象与类之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

OC——多态

分类: Objective C   81人阅读  评论(0)  收藏  举报

   不同的对象以自己的方式响应相同名称方法的能力称之为多态。

    两个相同名字的函数,函数体不一样。

多态:一个对外接口,多个内在实现。

静态绑定 在编译时就能确定调用哪个类里面的成员函数。

id是OC里的万能指针

可以指向任意类型。

动态绑定,在运行时才能确定调用哪个类的成员函数。

id 类型是动态对象

静态类型。

如果不涉及到多态,尽量使用静态类型。

静态类型优点

1在编译阶段(而不是运行阶段)抛出错误。

2,能够提高程序的可读性

id frac;

Fraction *frac;

哪个可读性强?


一、根据类名或对象生成一个class-object,可以发送class消息。  类的索引或(编号)

[Square class]  //通过类名声明。  (类方法)

[mysquare class]   //通过对象名声明。(实例方法)


判断两个对象是否在一个类

 if( [obj1class]==[obj12 class])

1.对象是不是class-object或其子类的成员?

-(BOOL)isKindofclass:class-object    kind(种类,性质的) 


//isKindOf是否为class-object或其父类的对象。

       if ([mySquareisKindOfClass:[Squareclass]]==YES)

        {

            NSLog(@"mySquare is a member of Square class");

        }

        

       if ([mySquareisKindOfClass:[Rectangleclass]]==YES)

        {

            NSLog(@"mySquare is a member of Rectangle class");

        }

        

       if ([mySquareisKindOfClass:[NSObjectclass]]==YES)

        {

            NSLog(@"mySquare is a member of NSObject class");

        }




2.对象是不是class-object的成员?

-(BOOL)isMemberofclass: class-0bject    member(成员,会员)

if ([mySquareisMemberOfClass:[Squareclass]]==YES)

        {

            NSLog(@"mySquare is a member of Square class");

        }

       if ([mySquareisMemberOfClass:[Rectangleclass]]==YES)

        {

            NSLog(@"mySquare is a member of Rectangle class");

        }

       if ([mySquareisMemberOfClass:[NSObjectclass]]==YES)

        {

            NSLog(@"mySquare is a member of NSObject class");

        }




3.某一个类是否指定类的子类。 判断类和类之间的关系

+(BOOL)subclassofclass:class-object    subclass(子集)

if ([SquareisSubclassOfClass:[Rectangleclass]]==YES)//类方法,用类名用调用

        {

            NSLog(@"Square is a subclass of a Rectangle");

        }


上面三个是判断 类和对象的关系。



下面是对象和类成员函数之间的关系。


@selector 指令   selector(选择器,挑战者)

为某个方法生成一个SEL值。

@selector(alloc)

@seclctor(setTo:over:)


SEL action=@selector (draw);

与selector有关的方法

1,类是否能响应selector指定的方法

                                        +(BOOL)instanceRespondSelector:selector      instance(实例,情况,建议), respond(回答,响应)

if ([RectangleinstancesRespondToSelector:@selector(setSide:)]==YES)

        {

            NSLog(@"Instances of Rectangle responds to setSide:method");

        }

       if ([SquareinstancesRespondToSelector:@selector(setSide:)]==YES)

        {

            NSLog(@"Instances of Square responds to setSide:method");

        }




2,对象是否能响应selector指定的方法

-(BOOL)respondsToSeletor:selector

if ([mySquarerespondsToSelector:@selector(setSide:)]==YES )

        {

            NSLog(@"mySquare responds to setSide:method");

        }

       if ([mySquare respondsToSelector:@selector(setWidth:andHeight:)]==YES)

        {

            NSLog(@"mySquaer responds to setWidth:andHeight:");

        }

        

       if ([SquarerespondsToSelector:@selector(alloc)]==YES)//Square是类名,即是类方法,也是实例方法。

        {

            NSLog(@"Square responds to alloc method");

        }




3.应用selector指定的方法

-(id)Performselector:selector    perform(执行,完成)

        //实例方法,对象调用的。selector指定的方法

        [mySquare performSelector:@selector(setSide:) withObject:(id)5];

        NSLog(@"side is:%i",(int)[mySquare performSelector:@selector(side)]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值