我们 已经学到过 有 几种方法 可以扩展 一类物件,比如:创建 属于这类物件的一类新物件、创建 类别等。还有 另外一种方法 就是:创建 一类物件,使 每个这类物件 都包含 其他类型的物件。由于 每个这类物件 都包含 其他类型的物件,所以 这样的物件 被称为 合成物件。
回忆一下 Square这类物件。Square这类物件 代表 正方形。之所以 将 Square这类物件 包含 在Rectangle这一类型当中,是因为 正方形 刚好 是 四条边相等的矩形。由于 所有Square类型的物件 同时 属于 Rectangle类型,所以 所有适用于Rectangle这类物件的措施 都 适用于 Square这类物件。虽然 这样,但是 有些措施 对于 Square这类物件 却 不合适。比如 setWidth:andHeight这项措施 是 用来设定 矩形的宽 和 高的,这项措施 虽然 适用于 Square这类物件,但是 却 显得 有些 多余。
我们 可以 像 这样 重新 创建 Square这类物件:
于是 每个Square类型的物件 都 包含 一个Rectangle类型的物件rectangle。这时 适用于Rectangle这类物件的措施 就不能 直接 适用于 Square这类物件了。虽然 这样,我们 还是 可以利用 适用于Rectangle这类物件的措施,比如 我们 可以 这样 编写 area这项措施:
在这项措施中,对 rectangle这个物件 采取的area这项措施 就属于 适用于Rectangle这类物件的措施。
如果 你 像这样 创建 一个Square类型的物件:
那么 你 仅仅 为 mySquare这个物件 分配了 内存空间,而 对于 mySquare这个物件所包含的rectangle这个物件 却 没有分配 内存空间。解决办法 是 重新 编写 init这项措施 或者 添加 initWithSide:这项措施。同时 我们 还需要 重新 编写 dealloc这项措施,这样 在腾空mySquare这个物件所占内存空间的同时 也能腾空 rectangle这个物件所占用的内存空间。