perl - Perl:使用单个方法重新定义父类的所有方法
问题描述
我正在为我的 Perl 应用程序编写一个文件管理器。每个文件的信息都保存为一个对象。当我删除一个文件时,我想将相应对象的类更改为 RemovedFile。对于此类,调用“文件”的任何有效方法都将返回致命错误和堆栈跟踪。这将是为了捕获一些对这个对象的过时引用被保留的情况(虽然它不应该)。
我想了两种方法可以实现这一点:
“RemovedFile”继承自“File”并通过调用致命错误重新定义其所有方法。不利的一面是,如果我向“文件”添加一个新方法,我也需要将它添加到“RemovedFile”中。
向“文件”的每个方法添加对某个空方法的调用。“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 中实现这种行为?例如,我可以使用一些技巧先列出然后动态地重新定义父类的所有方法而不指定它们的确切名称吗?
解决方案
您可以定义 RemovedFile 类,与原始 File 类没有任何关系。在 RemovedFile 中,使用AUTOLOAD来处理任何方法。
推荐阅读
- node.js - 显示具有多个角色的用户 discord.js
- python - 如何使用google api在python中注册?
- elixir - 为什么 Phoenix LiveView 上的表单中的 file_input 不返回 %Plug.Upload{}?
- docker - 无法在 docker 容器中打开文件夹
- objective-c - iOS 13 系统访问请求回调变化?
- node.js - Windows 上的 TestCafe 因 spawn powershell.exe ENOENT 错误而失败
- java - 如何只能从 SQL 数据库中获取 1 个元素?
- gulp - 从 gulp v3 迁移到 v4 期间 gulp 构建出错
- visual-studio - 为什么在我重建相同的代码后,Visual Studio 远程调试器不会在断点处停止?
- google-bigquery - 在 BigQuery 视图定义中使用变量