perlboot.html

来自「perl教程」· HTML 代码 · 共 851 行 · 第 1/5 页

HTML
851
字号
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../../displayToc.js"></script>
<script language="JavaScript" src="../../tocParas.js"></script>
<script language="JavaScript" src="../../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../../scineplex.css">
<title>perlboot - Beginner's Object-Oriented Tutorial</title>
<link rel="stylesheet" href="../../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>

<body>

<script>writelinks('__top__',2);</script>
<h1><a>perlboot - Beginner's Object-Oriented Tutorial</a></h1>
<p><a name="__index__"></a></p>

<!-- INDEX BEGIN -->

<ul>

	<li><a href="#name">NAME</a></li>
	<li><a href="#description">DESCRIPTION</a></li>
	<ul>

		<li><a href="#if_we_could_talk_to_the_animals___">If we could talk to the animals...</a></li>
		<li><a href="#introducing_the_method_invocation_arrow">Introducing the method invocation arrow</a></li>
		<li><a href="#invoking_a_barnyard">Invoking a barnyard</a></li>
		<li><a href="#the_extra_parameter_of_method_invocation">The extra parameter of method invocation</a></li>
		<li><a href="#calling_a_second_method_to_simplify_things">Calling a second method to simplify things</a></li>
		<li><a href="#inheriting_the_windpipes">Inheriting the windpipes</a></li>
		<li><a href="#a_few_notes_about__isa">A few notes about @ISA</a></li>
		<li><a href="#overriding_the_methods">Overriding the methods</a></li>
		<li><a href="#starting_the_search_from_a_different_place">Starting the search from a different place</a></li>
		<li><a href="#the_super_way_of_doing_things">The SUPER way of doing things</a></li>
		<li><a href="#where_we_re_at_so_far___">Where we're at so far...</a></li>
		<li><a href="#a_horse_is_a_horse__of_course_of_course__or_is_it">A horse is a horse, of course of course - or is it?</a></li>
		<li><a href="#invoking_an_instance_method">Invoking an instance method</a></li>
		<li><a href="#accessing_the_instance_data">Accessing the instance data</a></li>
		<li><a href="#how_to_build_a_horse">How to build a horse</a></li>
		<li><a href="#inheriting_the_constructor">Inheriting the constructor</a></li>
		<li><a href="#making_a_method_work_with_either_classes_or_instances">Making a method work with either classes or instances</a></li>
		<li><a href="#adding_parameters_to_a_method">Adding parameters to a method</a></li>
		<li><a href="#more_interesting_instances">More interesting instances</a></li>
		<li><a href="#a_horse_of_a_different_color">A horse of a different color</a></li>
		<li><a href="#summary">Summary</a></li>
	</ul>

	<li><a href="#see_also">SEE ALSO</a></li>
	<li><a href="#copyright">COPYRIGHT</a></li>
</ul>
<!-- INDEX END -->

<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>perlboot - Beginner's Object-Oriented Tutorial</p>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>If you're not familiar with objects from other languages, some of the
other Perl object documentation may be a little daunting, such as
<a href="../../lib/Pod/perlobj.html">the perlobj manpage</a>, a basic reference in using objects, and <a href="../../lib/Pod/perltoot.html">the perltoot manpage</a>, which
introduces readers to the peculiarities of Perl's object system in a
tutorial way.</p>
<p>So, let's take a different approach, presuming no prior object
experience. It helps if you know about subroutines (<a href="../../lib/Pod/perlsub.html">the perlsub manpage</a>),
references (<a href="../../lib/Pod/perlref.html">the perlref manpage</a> et. seq.), and packages (<a href="../../lib/Pod/perlmod.html">the perlmod manpage</a>), so become
familiar with those first if you haven't already.</p>
<p>
</p>
<h2><a name="if_we_could_talk_to_the_animals___">If we could talk to the animals...</a></h2>
<p>Let's let the animals talk for a moment:</p>
<pre>
    <span class="keyword">sub</span><span class="variable"> Cow::speak </span><span class="operator">{</span>
      <span class="keyword">print</span> <span class="string">"a Cow goes moooo!\n"</span><span class="operator">;</span>
    <span class="operator">}</span>
    <span class="keyword">sub</span><span class="variable"> Horse::speak </span><span class="operator">{</span>
      <span class="keyword">print</span> <span class="string">"a Horse goes neigh!\n"</span><span class="operator">;</span>
    <span class="operator">}</span>
    <span class="keyword">sub</span><span class="variable"> Sheep::speak </span><span class="operator">{</span>
      <span class="keyword">print</span> <span class="string">"a Sheep goes baaaah!\n"</span>
    <span class="operator">}</span>
</pre>
<pre>
    <span class="variable">Cow::speak</span><span class="operator">;</span>
    <span class="variable">Horse::speak</span><span class="operator">;</span>
    <span class="variable">Sheep::speak</span><span class="operator">;</span>
</pre>
<p>This results in:</p>
<pre>
    a Cow goes moooo!
    a Horse goes neigh!
    a Sheep goes baaaah!</pre>
<p>Nothing spectacular here.  Simple subroutines, albeit from separate
packages, and called using the full package name.  So let's create
an entire pasture:</p>
<pre>
    <span class="comment"># Cow::speak, Horse::speak, Sheep::speak as before</span>
    <span class="variable">@pasture</span> <span class="operator">=</span> <span class="string">qw(Cow Cow Horse Sheep Sheep)</span><span class="operator">;</span>
    <span class="keyword">foreach</span> <span class="variable">$animal</span> <span class="operator">(</span><span class="variable">@pasture</span><span class="operator">)</span> <span class="operator">{</span>
      <span class="operator">&amp;{</span><span class="variable">$animal</span><span class="operator">.</span><span class="string">"::speak"</span><span class="operator">};</span>
    <span class="operator">}</span>
</pre>
<p>This results in:</p>
<pre>
    a Cow goes moooo!
    a Cow goes moooo!
    a Horse goes neigh!
    a Sheep goes baaaah!
    a Sheep goes baaaah!</pre>
<p>Wow.  That symbolic coderef de-referencing there is pretty nasty.
We're counting on <code>no strict subs</code> mode, certainly not recommended
for larger programs.  And why was that necessary?  Because the name of
the package seems to be inseparable from the name of the subroutine we
want to invoke within that package.</p>
<p>Or is it?</p>
<p>
</p>
<h2><a name="introducing_the_method_invocation_arrow">Introducing the method invocation arrow</a></h2>
<p>For now, let's say that <code>Class-&gt;method</code> invokes subroutine
<code>method</code> in package <code>Class</code>.  (Here, &quot;Class&quot; is used in its
&quot;category&quot; meaning, not its &quot;scholastic&quot; meaning.) That's not
completely accurate, but we'll do this one step at a time.  Now let's
use it like so:</p>
<pre>
    <span class="comment"># Cow::speak, Horse::speak, Sheep::speak as before</span>
    <span class="variable">Cow</span><span class="operator">-&gt;</span><span class="variable">speak</span><span class="operator">;</span>
    <span class="variable">Horse</span><span class="operator">-&gt;</span><span class="variable">speak</span><span class="operator">;</span>
    <span class="variable">Sheep</span><span class="operator">-&gt;</span><span class="variable">speak</span><span class="operator">;</span>
</pre>
<p>And once again, this results in:</p>
<pre>
    a Cow goes moooo!
    a Horse goes neigh!
    a Sheep goes baaaah!</pre>
<p>That's not fun yet.  Same number of characters, all constant, no
variables.  But yet, the parts are separable now.  Watch:</p>
<pre>
    <span class="variable">$a</span> <span class="operator">=</span> <span class="string">"Cow"</span><span class="operator">;</span>
    <span class="variable">$a</span><span class="operator">-&gt;</span><span class="variable">speak</span><span class="operator">;</span> <span class="comment"># invokes Cow-&gt;speak</span>
</pre>
<p>Ahh!  Now that the package name has been parted from the subroutine
name, we can use a variable package name.  And this time, we've got
something that works even when <code>use strict refs</code> is enabled.</p>
<p>
</p>
<h2><a name="invoking_a_barnyard">Invoking a barnyard</a></h2>
<p>Let's take that new arrow invocation and put it back in the barnyard
example:</p>
<pre>
    <span class="keyword">sub</span><span class="variable"> Cow::speak </span><span class="operator">{</span>
      <span class="keyword">print</span> <span class="string">"a Cow goes moooo!\n"</span><span class="operator">;</span>
    <span class="operator">}</span>
    <span class="keyword">sub</span><span class="variable"> Horse::speak </span><span class="operator">{</span>
      <span class="keyword">print</span> <span class="string">"a Horse goes neigh!\n"</span><span class="operator">;</span>
    <span class="operator">}</span>
    <span class="keyword">sub</span><span class="variable"> Sheep::speak </span><span class="operator">{</span>
      <span class="keyword">print</span> <span class="string">"a Sheep goes baaaah!\n"</span>
    <span class="operator">}</span>
</pre>
<pre>
    <span class="variable">@pasture</span> <span class="operator">=</span> <span class="string">qw(Cow Cow Horse Sheep Sheep)</span><span class="operator">;</span>
    <span class="keyword">foreach</span> <span class="variable">$animal</span> <span class="operator">(</span><span class="variable">@pasture</span><span class="operator">)</span> <span class="operator">{</span>
      <span class="variable">$animal</span><span class="operator">-&gt;</span><span class="variable">speak</span><span class="operator">;</span>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?