面向对象三要素:继承、多态、封装(iOS)

来源:互联网 发布:java方法中布尔型变量 编辑:程序博客网 时间:2024/05/19 17:58

新浪微博:love_in_sky

2017年7月25日最新文章。

一、继承:
不要继承了,使用实现接口的方式吧。
设计UI组件的时候,容易将视图、数据和业务逻辑带进去。自定义的组件就成了一个臃肿的集合体,然后有新的需求的时候,你会选择继承一个,然后开始巴拉巴拉。这是很有问题的。看看系统提供的UITabelView,你就明白,它把数据和视图内容分开,数据部分使用接口去实现。然后我们将业务代码放在数据接口中,当然业务代码也可以被抽离出来。
所以这种情况下不要使用继承。

分清is-a和has-a:
is-a就是继承,has-a可以是组合或者包含成员。

什么时候使用继承?
1、MVC的model层面,不提供业务,只提供服务时,可用继承。
2、MVC的view层面,UITableViewCell这类的,可以使用继承。

怎样替代继承?
用Aspect+load来实现重载函数。
用Protocol定义接口。
用Category来实现添加函数。
耍点手段用Category来添加property。

二、多态:
可以使用父类+关联接口的模式。父类中定义一个实现关联接口的自身类。然后解决四大问题:
1、父类有部分public的方法是不需要,也不允许子类覆重
和工程师定义,所有的父类public方法都不允许被子类覆盖。
2、父类有一些特别的方法是必须要子类去覆重的,在父类的方法其实是个空方法
通过关联接口中的required方式规定子类必须实现的接口,父类就不必写空方法,直接调用子类的实现方法。
3、父类有一些方法是可选覆重的,一旦覆重,则以子类为准
在接口中的一些可选方法的后缀加入ByChild,表示会覆盖父类相关方法,并以子类为准。
4、父类有一些方法即便被覆重,父类原方法还是要执行的
在接口中的一些可选方法的后缀加入ByParentAndChild,表示会自动调用父类ByParent方法,然后自己加入子类的逻辑。

三、封装:
不是所有数据都需要去封装的,比如经常会封装的是model层,将返回的数据封装成一个个model,其实并不需要如此。因为将服务端返回的数据或者客户端请求的参数封装成一个个model时,会让很多操作变得更加复杂,比如需要转化,调试需要做处理才能更直观,容易插到各个不同的业务中,造成强耦合。

如果是单单指:把对外接口暴露,将实现和内部数据隐藏。没毛病

总结:
iOS架构谈,学会横切。一般在控制器的内部,大多数人都是面向过程的编程,我们通过纵切,将代码分撒各处。学会纵切只能说明你懂得复用代码,但可能引入危险的继承。横切则是将流程的关键点列出来,在关键点前后插入处理过程,可以认为是面向切片编程,横切更多的是采用接口实现。如果事先不知道如何横切,可以写多个纵切,然后在纵切中寻找可以横切的点。横切的好处是可以拆离数据和业务相关,更好移植。

阅读全文
0 0