13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

$colt = Horse::breed($molly, $stallion);不 过 , 这 是 回 避 继 承 关 系 , 实 际 上 总 是 错 误 的 处 理 方 法 。 我 们 很 容 易 想 象 实 际 上 没 有 这 么 个Horse::breed 子 过 程 , 因 为 Horse 和 Donkeys 都 是 从 一 个 公 共 的 叫 Equine ( 马 )的 父 类 继 承 来 的 那 个 秉 性 。 从 另 一 方 面 来 讲 , 如 果 你 希 望 表 明 <strong>Perl</strong> 应 该 从 一 个 特 定 类 开 始搜 索 某 方 法 , 那 么 只 要 使 用 普 通 的 方 法 调 用 方 式 , 只 不 过 用 方 法 名 修 饰 类 名 字 就 可 以 了 :$colt = $molly->Horse::breed($stallion);有 时 候 , 你 希 望 一 个 衍 生 类 的 方 法 表 现 得 象 基 类 中 的 某 些 方 法 的 封 装 器 。 实 际 上 衍 生 类 的 方法 本 身 就 可 以 调 用 基 类 的 方 法 , 在 调 用 前 或 者 调 用 后 增 加 自 己 的 动 作 。 你 可 以 把 这 种 表 示 法只 用 于 演 示 声 明 从 哪 个 类 开 始 搜 索 。 但 是 在 使 用 被 覆 盖 方 法 的 大 多 数 情 况 下 , 你 并 不 希 望 自己 要 知 道 或 者 声 明 该 执 行 哪 个 父 类 被 覆 盖 了 的 方 法 。这 就 是 SUPER 伪 类 提 供 便 利 的 地 方 。 它 令 你 能 够 调 用 一 个 覆 盖 了 的 基 类 方 法 , 而 不 用 声明 是 哪 个 类 定 义 了 该 方 法 。( 注 : 不 要 把 这 个 和 第 十 一 章 的 覆 盖 <strong>Perl</strong> 的 内 建 函 数 的 机 制 混淆 了 , 那 个 不 是 对 象 方 法 并 且 不 会 被 继 承 覆 盖 。 你 调 用 内 建 函 数 的 覆 盖 是 通 过 CORE 伪 包 ,而 不 是 SUPER 伪 包 。) 下 面 的 子 过 程 在 当 前 包 的 @ISA 里 查 找 , 而 不 会 要 求 你 声 明 特定 类 :package Mule;our @ISA = qw(Horse Donkey);sub kick {my $self = shift;print "The mule kicks!\n";$self->SUPER::kick(@_);}SUPER 伪 包 只 有 在 一 个 方 法 里 使 用 才 有 意 义 。 尽 管 一 个 类 的 实 现 器 可 以 在 它 们 自 己 的 代 码里 面 使 用 SUPER, 但 那 些 使 用 一 个 类 的 对 象 的 却 不 能 。当 出 现 多 重 继 承 的 时 候 ,SUPER 不 总 是 按 照 你 想 象 的 那 样 运 行 。 你 大 概 也 可 以 猜 到 , 它 也象 @ISA 那 样 遵 循 普 通 的 继 承 机 制 的 规 则 : 从 左 向 右 , 递 归 , 由 浅 入 深 。 如 果 Horse 和Donkey 都 有 一 个 speak 方 法 , 而 你 需 要 使 用 Donkey 的 方 法 , 你 将 不 得 不 明 确 命 名 该父 类 :sub speak {302

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

Saved successfully!

Ooh no, something went wrong!