首页 > 解决方案 > Perl:使用单个方法重新定义父类的所有方法

问题描述

我正在为我的 Perl 应用程序编写一个文件管理器。每个文件的信息都保存为一个对象。当我删除一个文件时,我想将相应对象的类更改为 RemovedFile。对于此类,调用“文件”的任何有效方法都将返回致命错误和堆栈跟踪。这将是为了捕获一些对这个对象的过时引用被保留的情况(虽然它不应该)。

我想了两种方法可以实现这一点:

  1. “RemovedFile”继承自“File”并通过调用致命错误重新定义其所有方法。不利的一面是,如果我向“文件”添加一个新方法,我也需要将它添加到“RemovedFile”中。

  2. 向“文件”的每个方法添加对某个空方法的调用。“RemovedFile”将重新定义这种报告致命错误的方法。(有关我的意思的示例,请参见下面的代码)。不利的一面是,“文件”的每种方法都必须在开始时调用“remove_guard”,而 IMO 不是很干净。

# Inside File class:
sub any_method_of_file_class {
    $self->_removed_guard();
    #rest of code
}

sub _removed_guard {
    #do nothing
}

# Inside RemovedFile class redefine only _removed_guard:

sub _removed_guard {
    $self->{logger}->fatal_with_stack_trace();
}

我想问是否有更好的方法在 Perl 中实现这种行为?例如,我可以使用一些技巧先列出然后动态地重新定义父类的所有方法而不指定它们的确切名称吗?

标签: perloopinheritancemethods

解决方案


您可以定义 RemovedFile 类,与原始 File 类没有任何关系。在 RemovedFile 中,使用AUTOLOAD来处理任何方法。


推荐阅读