OC之多态:
多态是什么?一个类的多种形态。你可以认为就是孙悟空和他的分身。
为什么要 分身,一个人做不到啊。
- 比如,你自定义了一个view叫做BBview(爸爸视图),你用他来实现放大缩小,点击翻转。现在,你又需要一个view来实现只能上下方向放大缩小。然后,你还需要一个view来实现即能点击翻转,还能3d折叠。 那么你要怎么做呢?
- 直接在BBview中加入一个3d折叠的方法,然后给三个方法分别开放enable的属性吗?用哪个让哪个enable?
好像也可以哦。是不是傻?这就好像你本来在煮饭,然后让你再去买菜,和打酱油。你都可以做到,但是,为什么不生个孩子呢?一个不行,生俩啊。孩子A只要会打酱油,孩子B去买菜。多好。
到项目中,也是。如果你的项目中之前一直是只有BBview,现在你突然加了个新方法,又给了3个enable的属性,那你不得去遍历之前用过这个BBview的地方,都去enable那三个属性吗?直接写个新的类出来继承,然后添加新方法,覆写旧方法,多好。
多态,就是继承一个父类,覆写父类的旧方法,当然新写的这个类,也可以加些新方法。
继续上边假设的情景:
BBview有俩方法,-(void)didScal; -(void)didOvertrun;
新加俩类,
Aview,覆写方法(-(void)didScal;)。-(void)didAScal;
Bview,覆写方法(-(void)didOvertrun;)。-(void)didBOverTrun;
添加新方法。-(void)3dtransform;
场景应用:
原来的使用:(之前项目中,某控制器下,使用旧的BBview,实现缩放,翻转)
[[BBview class] didScal];
[[BBview class] didOvertrun];
现在,你又需要一个view来实现只能上下方向放大缩小:
BBview *aView = [Aview new];
[Aview didAScal];
然后,你还需要一个view来实现即能点击翻转,还能3d折叠。
BBview bView = [Bview new];
[bView didBOverTrun];
[(Bview)bView 3dtransform];//此处需要注意,必需强转类型,因为,在父类中,没有3dtransform这个方法。
OK,至此,多态的情况大致明了。
现在,你既可以保证旧项目不改动,又可以满足新的需求。是不是就像在版本迭代呢?是的,多态就好像是在帮你的代码进行迭代一样,即扩展了你之前的类的方法,也保证了旧的存在。让你原本就已千疮百孔的代码还能继续匍匐前行。没有错,这也是多态的优点之一哦。
网友评论