我可以在Perl中的同一个类的方法中创建一个类的实例吗?

时间:2014-04-11 08:51:20

标签: perl oop

在同一个类的方法中创建类的实例是否合理?

我问及"合理性"而不是"可行性"因为我可以写一个工作的例子,如下:

package MyPkg;

sub new {
    ...
}

sub myMethod {
    my ($class, $param) = @_;
    my $obj = $class->new();
    ...
}

,用法是:

use MyPkg;
my $result = MyPkg->myMethod("abc");

这个体系结构确实按预期工作(在$result我得到了myMethod对"瞬态"对象的调用的结果,并且调用者甚至不被强迫显式实例化一个新对象,然后用它来调用它的方法。

虽然,我觉得这不是" Perl-ish",我的意思是......我不喜欢它。我觉得这种方法存在缺陷,但无法确定原因。

是否有更多的标准'溶液

2 个答案:

答案 0 :(得分:2)

是的,你可以这样做。这是quite widely done

答案 1 :(得分:2)

没有什么要求构造函数具有名称new,这只是惯例。您的myMethod子名称可能有不同的名称,但它也是构造函数。

其中一个例子是XML::LibXML。它有一个标准的构造函数,还有另外两个具有特定用途的构造函数:

use XML::LibXML '1.70';

# Parser constructor

$parser = XML::LibXML->new();
$parser = XML::LibXML->new(option=>value, ...);
$parser = XML::LibXML->new({option=>value, ...});

# Parsing XML

$dom = XML::LibXML->load_xml(
    location => $file_or_url
    # parser options ...
  );

# Parsing HTML

$dom = XML::LibXML->load_html(...);

后两个可能是new的包装器,但它们也是构造函数。

此外,一些对象被设计为不可变的。如果它们仍然允许对它们执行操作,则它们将需要返回相同类型的新对象。

所有这一切都是说,是的,你做的很好。