现在的位置: 首页 > 综合 > 正文

谈category的几点

2013年04月10日 ⁄ 综合 ⁄ 共 829字 ⁄ 字号 评论关闭

        Category(类别)是当年学Objc时所接触的特性,本人孤陋寡闻,不知道还有哪种高级语言有类似的特性,但这确实是很有用的特性。本文意图从面向对象的角度讨论Category,而暂撇开Objc的消息机制不论,故“消息”一词俱以面向对象术语“方法”代之。

1)使用

        对于一个较为通用的类A,若想往A上添一些方法,最为直接的方法是直接修改A。若新增加的方法仅在某些领域有用,这样做会让较为通用的A显得过于庞大,对此比较好的方法就是创建类别。例如Cocoa中的UIView——这个类有一个令人蛋疼的缺点,就是调用它的宽度(高度)需要敲很多键盘——aView.frame.size.width,这对于只用代码画view的码农来说是伤不起的,[aView
width]——能这么调用的话就能大大延缓指部关节炎的发作年龄。于是就可以创建名为ui的UIView类别,文件名的规范是UIView+ui...。

2)Intent

        接前文的例子,不把新的方法写在A中是为了防止A过于庞大,那么创建A的子类SubA,把新的方法添到SubA上呢?

        这样要多敲不少代码——但是Category的设计真的只是为了手指关节的健康?

        ——更重要的是,Category避免了菱形继承。

        UIView有了ui类别,UIButton的对象aButton也可以[aButton width]这么干。不然,UIButton需要多继承UIView和UIViewui,这是个菱形继承。当然Objc不支持多继承。

        或言之,[aButton width],本质上就是个菱形继承,只不过实现上大大简化了。

3)私有方法

        Objc的私有方法实现方式很奇怪——在m文件中写个匿名类别。

4)STL容器的继承

        有点扯远了。

        STL容器并不是为子类化而设计的——析构函数不是虚函数。但若子类中不添加新的数据成员,也是可以的,这样的子类类似于Objc中的Category。

抱歉!评论已关闭.