如何重新分类Perl对象

Dan*_*age 4 oop perl inheritance

我有一些Perl包的工作,我们会打电话给他们Some::Parser,并Some::Data.一个Some::Parser对象有方法返回类型的对象Some::Data.我写了一个扩展Some::Data课程的课程,让我们称之为My::Data.类的对象My::Data实际上只是类的对象Some::Data,但使用其他方法可以更容易地使用它.

我的问题是我想继续使用Some::Parser该类来完成解析数据的艰苦工作.正如我之前所说,Some::Parser对象给了我Some::Data对象.一旦我掌握了一个Some::Data对象,有没有办法将其重新分类为My::Data对象?我该怎么做?

我完全愿意改变我的方法,假设有人可以提出一个更好的方法来做我想做的事情,但编写我自己的解析器并不是我有兴趣做的事情!

fri*_*edo 10

这闻起来有点像kludge.可能是重新考虑您的策略的时候了.例如,也许您应该编写My::Parser哪些返回My::Data对象.

但是如果您不想这样做,可以手动使用bless来更改对象的类:

my $obj = Some::Data->new;
bless $obj, 'My::Data';
Run Code Online (Sandbox Code Playgroud)

见perldoc 祝福.


cjm*_*cjm 7

处理类似这样的事情的最佳方法可能是Some::Parser提供一种方法来指定它应该用于数据对象的类.例如,HTML :: TreeBuilder提供了该element_class方法.如果希望TreeBuilder生成除HTML::Element节点之外的其他内容,则进行子类化HTML::TreeBuilder和覆盖element_class以返回所需的节点类.(TreeBuilder中的实际代码有点复杂,因为在HTML-Tree 4之前有一种不同的机制可以执行此操作,并且新的维护者不想破坏它.)

我认为你没有写Some::Parser,但也许它已具备这种能力.如果没有,也许它的维护者会接受补丁.这应该是一个相当简单的改变.您只需添加一个data_class方法(sub data_class { 'Some::Data' }),然后更改Some::Data->new$self->data_class->new.然后你可以Some::Parser创建子类My::Parser,然后重写data_class.


And*_*ter 5

你可以做bless任何事情.

Perl 5中的继承只不过是搜索@ISA.