当我做这样的事情时会发生什么:
$stallion = Horse->new(gender => "male");
$molly = Mule->new(gender => "female");
$colt = $molly->breed($stallion);
我无法理解该代码发生了什么?
从那个例子中,有2个不同的类吗? (具有新方法或构造函数的Horse类,具有另一个新构造函数的Mule类)。
$ colt = $ molly->品种($ stallion);
从该代码中,我的理解是$molly
与Mule类相同,后者具有除new
- breed
之外的其他方法。我是对的吗?
答案 0 :(得分:3)
从那个例子中,有2个不同的类吗? (具有新方法或构造函数的Horse类,具有另一个新构造函数的Mule类)。
非常正确。
只要您看到STRING_LITERAL->METHOD_NAME()
的表达式,STRING_LITERAL
几乎可以保证是一个类名。
当你看到STRING_LITERAL->new()
,时,除非编写代码的人决定对自己的好过于聪明,否则这将调用该类的构造函数,返回那个班的对象。 (但是,作为构造函数的“new”只是一个自愿约定; Perl中没有任何内容强制执行 - 太聪明/愚蠢的人已经定义了“new()”sub来返回值2+3
- 除了查看代码和测试外,您无法保证
在那个例子之后,你希望得到:
$ stallion - 持有从Horse类构造函数返回的值 - 将具有类Horse的对象作为值。
$ molly - 持有从Mule类构造函数返回的值 - 将作为类Mule对象的值。
当种马参考传递给另一个类的实例化时会发生什么?
$molly->breed($stallion);
调用中发生了什么 - 正如昨天的问题所回答的那样,这是一种调用方法的对象方式,所以你要做的是:
breed()
子例程,该子例程当然必须在$ molly对象所属的类中定义(例如,是Mule
类中的方法)breed()
子程序中,特殊列表变量@_
将别名为此参数列表的元素($ molly,$ stallion)。并且该代码在另一个类中是另一种方法吗?
如上面的一个要点所示,是的,如果$ molly是某个类(Mule)的对象,则表达式$molly->METHOD_NAME()
表示调用已知的该名称的方法(从父级定义或继承)在这个类中,$ molly是其中的一个对象。