13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

你 现 在 应 该 可 以 在 原 先 Critter 使 用 的 任 何 地 方 使 用 Horse 类 或 者 对 象 了 。 如 果 你 的 新类 通 过 了 这 样 的 空 字 类 测 试 , 那 么 你 就 可 以 认 为 Critter 是 一 个 正 确 的 基 类 , 可 以 用 于 继承 。假 设 你 在 $steed 里 有 一 个 Horse 对 象 , 并 且 在 他 上 面 调 用 了 一 个 move:$steed->move(10);因 为 $steed 是 一 个 Horse,<strong>Perl</strong> 对 该 方 法 的 第 一 个 选 择 是 Horse::move 子 过 程 。 如果 没 有 ,<strong>Perl</strong> 先 询 问 @Horse::ISA 的 第 一 个 元 素 , 而 不 是 生 成 一 个 运 行 时 错 误 , 这 样 将导 致 查 询 到 Critter 包 里 , 并 找 到 Critter::move。 如 果 也 没 有 找 到 这 个 子 过 程 , 而 且Critter 有 自 己 的 @Critter::ISA 数 组 , 那 么 继 续 查 询 那 里 面 的 父 类 , 看 看 有 没 有 一 个move 方 法 , 如 此 类 推 直 到 上 升 到 继 承 级 别 里 面 一 个 没 有 @ISA 的 包 。我 们 刚 刚 描 述 的 情 况 是 单 继 承 的 情 况 , 这 时 每 个 类 只 有 一 个 父 类 。 这 样 的 继 承 类 似 一 个 相 关包 的 链 表 。<strong>Perl</strong> 还 支 持 多 继 承 ; 只 不 过 是 向 该 类 的 @ISA 里 增 加 更 多 的 包 。 这 种 继 承 的运 做 更 象 一 个 树 状 结 构 , 因 为 每 个 包 可 以 有 多 于 一 个 的 直 接 父 类 。 很 多 人 认 为 这 样 更 带 劲 。当 你 调 用 了 调 用 者 的 一 个 类 型 为 classname 的 方 法 methname,<strong>Perl</strong> 将 尝 试 六 种 不 同的 方 法 来 找 出 所 用 的 子 过 程 ( 译 注 : 又 是 孔 乙 己 ?:):1. 首 先 ,<strong>Perl</strong> 在 调 用 者 自 己 的 包 里 查 找 一 个 叫 classname::methname 的 子 过 程 。如 果 失 败 , 则 进 入 继 承 , 并 且 进 入 步 骤 2。2. 第 二 步 ,<strong>Perl</strong> 通 过 检 查 @classname::ISA 里 列 出 的 所 有 父 包 , 检 查 从 基 类 继 承过 来 的 方 法 , 看 看 有 没 有 parent::methname 子 过 程 。 这 种 搜 索 是 从 左 向 右 , 递 归 的 ,由 浅 入 深 进 行 的 。 递 归 保 证 祖 父 类 , 曾 祖 父 类 , 太 祖 父 类 等 等 类 都 进 入 搜 索 。3. 如 果 仍 然 失 败 ,<strong>Perl</strong> 就 搜 索 一 个 叫 UNIVERSAL::methname 的 子 过 程 。4. 这 时 ,<strong>Perl</strong> 放 弃 methname 然 后 开 始 查 找 AUTOLOAD。 首 先 , 它 检 查 叫 做classmane::AUTOLOAD 的 子 过 程 。5. 如 果 上 面 的 失 败 ,<strong>Perl</strong> 则 搜 索 所 有 在 @classname::ISA 里 列 出 的 parent 包 ,寻 找 任 何 parent::AUTOLOAD 子 过 程 。 这 样 的 搜 索 仍 然 是 从 左 向 右 , 递 归 的 , 由 浅入 深 进 行 的 。6. 最 后 ,<strong>Perl</strong> 寻 找 一 个 叫 UNIVERSAL::AUTOLOAD 的 子 过 程 。<strong>Perl</strong> 会 在 找 到 的 第 一 个 子 过 程 处 停 止 并 调 用 该 子 过 程 。 如 果 没 有 找 到 子 过 程 , 则 产 生 一 个例 外 , 也 是 你 经 常 看 到 的 :Can't locate object method "methname" via package "classnaem"299

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!