【问题标题】:How to make all inherited methods return subclass objects?如何让所有继承的方法返回子类对象?
【发布时间】:2016-05-08 07:41:38
【问题描述】:

我正在HTML::Element 之上编写一个hOCR::Element 包来处理hOCR 内容。因此,来自hOCR::Element 类的对象继承了属于HTML::Element 的所有方法。

但是由于HTML::Element 中的许多基本方法(例如find_by_tag_namelook_down)返回HTML::Element 对象,我认为自己必须为每个这样的方法编写一个对应的hOCR::Element 包装器通过祝福简单地将其映射为hOCR 的方法是HTML

例如:

package hOCR::Element;

use HTML::Element;
use parent 'HTML::Element';

sub new {
  my ($class, %params) = @_;
  my $self = $class->SUPER::new (%params);
  return bless $self, $class;
}

sub look_down { 
  my $self = shift;
  return map { bless $_, 'hOCR::Element' } $self->SUPER::look_down (@_);
}

1;

如何让子类继承其基类的所有方法,以使这些相关方法返回子类对象而不是基类对象,而不必为每个此类父方法编写包装器?

【问题讨论】:

  • 你可以考虑写一个AUTLOAD子程序而不是从HTML::Element继承,但这有点难看
  • 谢谢。会是丑陋,还是以后会给我带来真正的麻烦?
  • 我没有看到任何危险
  • 还可以查看 Class::Method::Modifiers。您可以通过这些列表。它不像 AUTOLOAD 那样难看,但工作量更大,灵活性也更低。我正在打电话,所以不像今天。

标签: perl oop inheritance


【解决方案1】:
sub look_down { 
    my $self = shift;
    return bless $self->SUPER::look_down (@_) ,HTML::Element ;
}

【讨论】:

  • OP 要求解决方案“无需为每个这样的父方法编写包装器”
猜你喜欢
  • 2010-12-20
  • 2013-04-17
  • 1970-01-01
  • 2019-07-27
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多