在对象实例上调用new有什么好处?

Geo*_*Geo 11 oop perl constructor factory-pattern

我正在读Programming Perl,我找到了这段代码:

sub new {
    my $invocant = shift;
    my $class   = ref($invocant) || $invocant;
    my $self = {
        color  => "bay",
        legs   => 4,
        owner  => undef,
        @_,                 # Override previous attributes
    };
    return bless $self, $class;
}
Run Code Online (Sandbox Code Playgroud)

对于像这样的构造函数,调用new对象实例有什么好处?我认为这是它的用途,对吧?我的猜测是,如果有人想编写这样的构造函数,他将不得不添加一些代码,将第一个对象的属性复制到即将创建的对象.

DVK*_*DVK 12

所以你可以构造同一个类的另一个对象而不知道原始类的对象是什么 - 这可以使一些非常简洁的紧凑工厂模式.

例如,当您需要构建资源对象时,这很有用,因为需要并且计算WHICH类资源对象的成本很高(例如,长时间运行的数据库查询).因此,工厂会看到它是否传递了一个旧的资源对象,如果是,只需调用就创建一个$old_object->new()- 避免重新计算资源类型的资源成本.

再举一个例子,如果你有一个表示动物的类层次结构,以及一个用于在模拟中构建新动物的工厂,你可以调用$newborn = $factory->make_new_animal($mother)工厂实现仅仅是$object->new()


yst*_*sth 7

我没有看到任何真正的好处.你总是可以做ref($obj)->new或有办法做$obj->clone; 那样你就不会想知道这两个中哪一个$object->new在做什么.

  • 呼叫方"明显">被叫方"明显" (3认同)

Eth*_*her 5

正如其他人所说的那样,它允许多态创建新的对象实例,而不必知道该实例的类型.

至于对象克隆,我通常编写显式的clone()或copy()方法,可以正确地复制属性和其他数据,但是没有理由说new()不能处理这个角色,只要它清楚地记录下来.但是,我认为分别定义它们有两个好处:

  1. 能够使用不同的类(孩子,或混合/角色(例如Moose角色))来覆盖各种行为
  2. 使代码更清晰的可能性,例如创建新的"空"对象所需的步骤与克隆现有对象的步骤非常不同.