你必须在面向对象的Perl中命名构造函数'new'吗?

时间:2015-09-17 16:40:42

标签: perl oop

我写了一些面向对象的Perl,我使用new关键字作为构造函数的名称。如果我将new更改为car,它仍然有效。

new是构造函数所需的预定义关键字,还是可以使用自己的构造函数名称?

3 个答案:

答案 0 :(得分:8)

new不是关键字,它对Perl完全没有意义。 bless是构造对象的原因。如果你想要一个名为load的构造函数,那没问题。 car似乎不是构造函数名称的好选择。但正如你所说,它也有效。

答案 1 :(得分:1)

引用perlootut

  

在Perl中,没有用于构造对象的特殊关键字。然而,   CPAN上的大多数OO模块使用名为“new()”的方法来构造新的   对象

我建议你通过运行以下perl程序来试验它是如何工作的:

#!/usr/bin/perl -w

use strict;
use warnings;
use feature qw/say/;

package A;
sub new { say "hello: @_"; bless [] }

package B;
sub new { say "world: @_"; bless [] }
sub old { say "hi: @_" };

package main;

# This prints 'hello: 1 2 3', since it calls directly the sub A::new
A::new(1,2,3);

# Equivalent forms, print 'hello: A 1 2 3'
new A(1,2,3);
A->new(1,2,3);
# Both forms call the A::new sub and pass a string "A" as first argument.

# The bareword B is used this time. Perl knows the B::new function
# must be called. "B" is passed as first parameter.
# This prints 'world B 1 2 3'
my $b = new B(1,2,3);

# Prints something similar to 'hi: B=ARRAY(0x16b7630) 4 5 6'
# A blessed reference always carries around as context information
# about its package.
$b->old(4,5,6);

# Equivalent
B::old($b, 4, 5, 6);

一旦你理解了这一点,就可以看到构造函数只是一个返回祝福引用的函数。你可以随意调用它。

注意A::newA->new之间的区别非常重要,因为只有第二种形式使用包名作为第一个参数。根据原则,您的软件包的用户可以通过两种方式调用new。在示例中,我们不使用除打印之外的参数,但如果您使用它们,则最好记录人们应该如何打电话给您的建设者。

另请参阅此相关问题:In Perl OOP, is there any official recommendations on initialisation within the constructor?

答案 2 :(得分:0)

您可以将任何您喜欢的名称用于其类的构造函数。但如果你不遵循这个惯例,总是要想到别人或你自己可能遇到的困难。

这是一种很好的做法,增加了阅读他人写的代码的理解力。值得注意的是,有很多方法( TMTOWTDI )来编写面向对象的Perl。官方文档非常清晰且有用:perlobjperlootut驼鹿是推荐的方式,但还有很多其他方式,包括使用“原始”形式。

如果你是以原始形式编程---不推荐---关键是在它的构造函数中使用 bless ,并且名称对于要运行的代码没有区别,但它对于可读性和理解很重要。