我正在为我的 Perl 应用程序编写一个文件管理器。有关每个文件的信息作为对象保存。当我删除一个文件时,我想将相应对象的类更改为RemovedFile。对于此类,调用“File”的任何有效方法都将返回 fatal error 和堆栈跟踪。这将是为了捕获保留对此对象的某些陈旧引用的情况(虽然不应该)。
我考虑了两种实现此目的的方法:
“RemovedFile”继承自“File”,并通过调用 fatal error 重新定义其所有方法。这样做的缺点是,如果我向“File”添加新方法,我还需要将其添加到“RemovedFile”。
向“File”的每个方法添加对某个空方法的调用。 “RemovedFile”将重新定义这一报告 fatal error 的方法。 (请参阅下面的代码以了解我的意思的示例)。这样做的缺点是“File”的每个方法都必须在开始时调用“remove_guard”,这在我看来不是很干净。
# 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中是否有更好的方法来实现这种行为? 例如,我可以使用一些技巧来首先列出然后动态地重新定义父类的所有方法而不指定它们的确切名称吗?
最佳答案
您可以定义与原始 File 类没有任何关系的RemovedFile 类。在RemovedFile中,使用AUTOLOAD处理任何方法。
关于Perl:用单个方法重新定义父类的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62949880/