3

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

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

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

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

    $colt = $molly->breed($stallion);

从该代码中,我的理解是,$molly这与具有其他方法的 Mule 类相同new- breed。我对吗?

4

1 回答 1

3

从那个例子来看,有 2 个不同的类吗?(Horse 类具有新方法或构造函数,Mule 类具有另一个新构造函数)。

很正确。

每当您看到 的表达式时STRING_LITERAL->METHOD_NAME()STRING_LITERAL几乎可以保证它是一个类名。

当您看到时STRING_LITERAL->new()除非编写代码的人为了自己的利益而决定太聪明,否则这将是对该类的构造函数的调用,并返回该类的一个对象。(然而,作为构造函数的“新”只是一个自愿约定;Perl 中没有强制执行这一点 - 太聪明/愚蠢的人可以定义“新()”子来返回值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是一个对象。

于 2013-06-19T02:40:03.650 回答