gpt4 book ai didi

perl - 如何创建一个对象,其派生类由创建属性隐式指定?

转载 作者:行者123 更新时间:2023-12-01 11:10:01 26 4
gpt4 key购买 nike

我正在寻找以下内容的模式。 (我在 Perl 中工作,但我认为语言不是特别重要)。

父类 Foo 和子类 Bar、Baz、Bazza。

构造 Foo 的方法之一是解析字符串,该字符串的一部分将隐式指定要创建的类。因此,例如,如果它以“http:”开头,那么它就是一个 Bar,但如果它不以“[Date]”开头,那么 Baz 就会喜欢它,依此类推。

现在,如果 Foo 知道它所有的 child ,什么字符串是 Bar,什么是 Baz 等等,它可以调用适当的构造函数。但是基类不应该知道关于它的 child 的任何信息。

我想要的是 Foo 的构造函数能够依次尝试其子项,直到其中一个说“是的,这是我的,我会创建这个东西”。

我意识到在一般情况下这个问题没有明确定义,因为可能有不止一个 child 会接受字符串,所以它们被调用的顺序很重要:忽略这个并假设特征字符串是这样的,只有一个子类会喜欢该字符串。

我想出的最好办法是让子类在初始化时向基类“注册”,以便它获得构造函数列表,然后循环遍历它们。但是我是否缺少更好的方法?

示例代码:

package Foo;

my @children;

sub _registerChild
{
push @children, shift();
}

sub newFromString
{
my $string = shift;
foreach (@children) {
my $object = $_->newFromString(@_) and return $object;
}
return undef;
}

package Bar;
our @ISA = ('Foo');

Foo::_registerChild(__PACKAGE__);

sub newFromString
{
my $string = shift;
if ($string =~ /^http:/i) {
return bless(...);
}
return undef;
}

最佳答案

也许你可以用 Module::Pluggable 来实现它?这将消除注册的需要。

我之前采用的方法是使用 Module::Pluggable 加载我的子模块(这允许我通过简单地编写和安装它们来添加新的子模块)。每个子类都有一个构造函数,返回一个 blessed 对象或 undef。你遍历你的插件直到你得到一个对象,然后返回它。

类似于:

package MyClass;
use Module::Pluggable;

sub new
{
my ($class, @args) = @_;
for my $plugin ($class->plugins)
{
my $object = $plugin->new(@args);
return $object if $object;
}
}

Class:Factory也可以,但对于您的需求来说,这可能有点过头了。

关于perl - 如何创建一个对象,其派生类由创建属性隐式指定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1000681/

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