转自:http://www.tongwenguan.com/
关于 类别,有 几点 值得提出来。第一、虽然 通过 类别,你 能够 对同一类的每个物件所包含的变量 进行读写,但是 你 不能给 他们 添加 新的变量。万一 你 要 这么 做,你 只能 创建 一类新的物件,并且 让 这一类新的物件 被包含 在原来那类物件当中。
其次、类别中的新措施 可以覆盖 原有的措施,但是 这种编程习惯 一般来说 很糟糕。一旦 你 覆盖了 原有的措施,你 就无法 再 采取 原有的措施了。所以,你 在覆盖 原有的措施时,你 必须要将 原有措施的功能 复制下来。如果 你 真的 需要用 新的措施 覆盖 原有的措施,那么 创建 一类新的物件,并 使 其 被包含 在原来那类物件当中 则 是 明智的选择。因为 如果 这样,一旦 你 用 新的措施 覆盖了 原有的措施,你 还可以 通过关键字super 采取 原有的措施;而且 你 也不需要理解 原有的措施,你 只要 在新的措施当中 采取 原有的措施,并且 加上 新的功能 就可以了。
无论 你 想创建 多少类别 都可以。但是 如果 你 在多个类别中 编写 同一项措施,那么 运行时 实施 哪像措施 就不确定了。
与 正常的接口部分 不同,你 不需要 在一个类别中 编写 所有的措施。
记住:在类别中 编写 新的措施 从而 对 某类物件 进行扩展 不但 对 这类物件 产生影响,而且 对 包含在这类物件当中的其他类别的物件 产生影响。像 这样 给 NSObject这类物件 添加 新的措施 十分 危险,因为 其它所有类型的物件 都包含 在NSObject这类物件当中,给NSObject这类物件添加的新措施 会适用于 其它所有类型的物件。
通过添加 新的类别 给 已有的物件类型 添加 新的措施 虽然 可以很好地 实现 你的目的,但是 你 新添加的措施 很可能 与 已有的物件 矛盾。比如,Square这类物件本身 代表 正方形,但是 你 在新的类别中添加的新措施 却 可能把 Square这类物件 当作 圆 使用。这样的习惯 十分 糟糕。