gpt4 book ai didi

Perl - 从父类(super class)(OO)调用子类构造函数

转载 作者:行者123 更新时间:2023-12-04 06:49:33 25 4
gpt4 key购买 nike

这可能会成为一个令人尴尬的愚蠢问题,但比可能创建令人尴尬的愚蠢代码要好。 :-) 这是一个面向对象的设计问题,真的。

假设我有一个对象类“Foos”,它表示一组动态配置元素,这些元素是通过查询磁盘上的命令“mycrazyfoos -getconfig”获得的。假设我希望 'Foos' 对象具有两类行为:

  • 现有的:一是查询我刚才提到的命令输出中存在的那些(/usr/bin/mycrazyfoos -getconfig`。通过shellout命令对现有的进行修改。
  • 创建不存在的新的;新的 'crazyfoos',使用一组复杂的 /usr/bin/mycrazyfoos命令和参数。在这里,我不仅仅是在查询,而是在实际运行一堆 system() 命令。影响变化。

  • 这是我的类结构:

    文件

    Foos 包,它有一个 new($hashref->{name => 'myfooname',) 构造函数,它接受一个 'crazyfoo NAME' 然后查询该 NAME 的存在以查看它是否已经存在(通过 shell 并运行上面的 mycrazyfoos 命令)。如果那个 crazyfoo 已经存在,返回一个 Foos::Existing 对象。对此对象的任何更改都需要进行炮击、运行命令并确认一切正常。

    如果这是要走的路,那么 new() 构造函数需要进行测试以查看要使用哪个子类构造函数(如果这在此上下文中甚至有意义)。以下是子类:

    Foos/Existing.pm

    如上所述,这是针对 Foos 对象已经存在的情况。

    Foos/Pending.pm

    如果在上面的“crazyfoo NAME”实际上不存在,则将创建该对象。在这种情况下,上面的 new() 构造函数将被检查是否有其他参数,它将继续执行,当使用 ->create() 调用时,使用 system() 退出并创建一个新对象......可能会返回一个 '现有的一个...

    或者

    当我输入这个时,我意识到最好有一个:

    (另一种安排)

    Foos 类,它有一个

    ->new() 只需要一个名字

    ->create() 需要额外的创建参数

    ->delete(), ->change() 和其他影响存在的参数;这将不得不动态检查。

    所以我们在这里,有两个主要方向。我很好奇哪种方式更智能。

    最佳答案

    一般来说,new 是一个错误(设计方面的,而不是语法方面的)方法返回除新对象之外的任何内容。如果您想有时返回现有对象,请将该方法调用其他方法,例如new_from_cache() .

    我还觉得奇怪的是,您不仅将这个功能(构造一个新对象,然后返回一个现有对象)拆分成单独的命名空间,而且还拆分成不同的对象。所以总的来说,你更接近你的第二种方法,但你仍然可以让主构造函数( new )处理各种参数:

    package Foos;
    use strict;
    use warnings;

    sub new
    {
    my ($class, %args) = @_;

    if ($args{name})
    {
    # handle the name => value option
    }

    if ($args{some_other_option})
    {
    # ...
    }

    my $this = {
    # fill in any fields you need...
    };

    return bless $this, $class;
    }

    sub new_from_cache
    {
    my ($class, %args) = @_;

    # check if the object already exists...

    # if not, create a new object
    return $class->new(%args);
    }

    注意:我不想在你还在学习的时候把事情复杂化,但你可能还想看看 Moose ,它为您处理了许多构造的血腥细节,以及属性及其访问器的定义。

    关于Perl - 从父类(super class)(OO)调用子类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776234/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com