将对象传递给Perl中的另一个类

时间:2013-06-19 02:26:11

标签: perl oop

当我做这样的事情时会发生什么:

$stallion = Horse->new(gender => "male");
$molly = Mule->new(gender => "female");
$colt = $molly->breed($stallion);

我无法理解该代码发生了什么?

  1. 当该种马参考传递给另一个类实例时会发生什么?
  2. 并且该代码在另一个类中是另一种方法吗?
  3. 从那个例子中,有2个不同的类吗? (具有新方法或构造函数的Horse类,具有另一个新构造函数的Mule类)。

    $ colt = $ molly->品种($ stallion);

  4. 从该代码中,我的理解是$molly与Mule类相同,后者具有除new - breed之外的其他方法。我是对的吗?

1 个答案:

答案 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);调用中发生了什么 - 正如昨天的问题所回答的那样,这是一种调用方法的对象方式,所以你要做的是:

    • 创建参数列表(在本例中为$ stallion)
    • 将对象添加到它,导致($ molly,$ stallion)
    • 将该列表传递给breed()子例程,该子例程当然必须在$ molly对象所属的类中定义(例如,是Mule类中的方法)
    • breed()子程序中,特殊列表变量@_将别名为此参数列表的元素($ molly,$ stallion)。
    • 然后100%完全取决于如何编写“品种”子代码
  

并且该代码在另一个类中是另一种方法吗?

如上面的一个要点所示,是的,如果$ molly是某个类(Mule)的对象,则表达式$molly->METHOD_NAME()表示调用已知的该名称的方法(从父级定义或继承)在这个类中,$ molly是其中的一个对象。