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.

sub clone {my $model = shift;my $self = $model->new(%$model, @_);return $self;# 前 面 被 ->new 赐 福 过 了}( 你 可 以 把 这 个 功 能 直 接 放 进 new 里 , 但 是 这 样 的 话 名 字 就 不 是 那 么 适 合 这 个 函 数 了 。)请 注 意 我 们 即 使 是 在 clone 构 造 器 里 , 我 们 也 没 有 硬 编 码 Horse 类 的 名 字 。 我 们 让 最 初的 那 个 对 象 调 用 它 自 己 的 new 方 法 , 不 管 是 什 么 。 如 果 我 们 把 它 写 成 Horse->new 而不 是 $model->new, 那 么 该 类 不 能 帮 助 实 现 Zebra( 斑 马 ) 或 Unicorn ( 独 角 兽 )类 。 你 应 该 不 会 想 克 隆 一 匹 飞 马 但 是 却 突 然 发 现 你 得 到 是 一 匹 颜 色 不 同 的 马 。不 过 , 有 时 候 你 碰 到 的 是 相 反 的 问 题 : 你 不 是 想 在 不 同 的 类 里 共 享 一 个 构 造 器 , 而 是 想 多 个构 造 器 共 享 一 个 类 对 象 。 当 一 个 构 造 器 想 调 用 一 个 基 类 的 构 造 器 作 为 构 造 工 作 的 一 部 分 的 时候 就 会 出 现 这 种 问 题 。<strong>Perl</strong> 不 会 帮 你 做 继 承 构 造 。 也 就 是 说 ,<strong>Perl</strong> 不 会 为 任 何 基 类 或 者 任何 其 他 所 需 要 的 类 自 动 调 用 构 造 器 ( 或 者 析 构 器 ), 所 以 你 的 构 造 器 将 不 得 不 自 己 做 这 些 事情 然 后 增 加 衍 生 的 类 所 需 要 的 附 加 的 任 何 属 性 。 因 此 情 况 不 象 clone 过 程 那 样 , 你 不 能 把一 个 现 有 的 对 象 拷 贝 到 新 对 象 里 , 而 是 先 调 用 你 的 基 类 的 构 造 器 , 然 后 把 新 的 基 类 对 象 变 形为 新 的 衍 生 对 象 。12.5 类 继 承对 <strong>Perl</strong> 的 对 象 系 统 剩 下 的 内 容 而 言 , 从 一 个 类 继 承 另 外 一 个 类 并 不 需 要 给 这 门 语 言 增 加 特殊 的 语 法 。 当 你 调 用 一 个 方 法 的 时 候 , 如 果 <strong>Perl</strong> 在 调 用 者 的 包 里 找 不 到 这 个 子 过 程 , 那 么它 就 检 查 @ISA 数 组 ( 注 : 发 音 为 "is a", 象 "A horse is a critter。" 里 哪 样 )。 <strong>Perl</strong>是 这 样 实 现 继 承 的 : 一 个 包 的 @ISA 数 组 里 的 每 个 元 素 都 保 存 另 外 一 个 包 的 名 字 , 当 缺 失方 法 的 时 候 就 搜 索 这 些 包 。 比 如 , 下 面 的 代 码 把 Horse 类 变 成 Critter 类 的 字 类 。( 我们 用 our 声 明 @ISA, 因 为 它 必 须 是 一 个 打 包 的 变 量 , 而 不 是 用 my 声 明 的 词 。)package Horse;our @ISA = "Critter";298

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

Saved successfully!

Ooh no, something went wrong!