perl - 如何以 `can`看不到的方式隐藏基类中的方法?

标签 perl oop inheritance

我尝试通过前向声明子例程来隐藏基类中的方法,例如:

sub xid;

如果我调用这个方法,我会得到预期的错误:

DBG> $tuple->xid
ERROR: Undefined subroutine &HyperMouse::Schema::Result::SaldoAnal::xid called at (eval 2346)[/home/kes/perl5/perlbrew/perls/perl-5.24.1/lib/site_perl/5.24.1/DB/Hooks.pm:422] line 8, <STDIN> line 13.

但是 $tuple->can( 'xid' ) 仍然返回真值:

&HyperMouse::Schema::Result::SaldoAnal::xid

如何隐藏 xid 方法,让 $tuple->can( 'xid' ) 返回 false 而不是:

&HyperMouse::Schema::Result::SaldoAnal::xid

最佳答案

你可以覆盖可以

隐藏所有现有但未定义的子项:

sub can {
   my $self = shift;
   my $cv = $self->SUPER::can(@_)
      or return undef;
   defined(&$cv)
      or return undef;
   return $cv;
}

隐藏特定的子:

sub can {
   my $self = shift;
   my $cv = $self->SUPER::can(@_)
      or return undef;
   $cv == \&xid
      and return undef;
   return $cv;
}

您隐藏基类方法的整个尝试是一件非常奇怪的事情。导致调用失败也就不足为奇了。

sub xid {
   croak("Not supported.");
}

但这并不能真正掩盖糟糕的类设计的恶臭。

无论您使用哪种 hack,都可以完全绕过

$tuple->Base::Class::xid()

关于perl - 如何以 `can`看不到的方式隐藏基类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179634/

相关文章:

inheritance - 为什么在 systemverilog 中继承常量变量不起作用

inheritance - SQLAlchemy 和过滤多态查询

c# - 我应该在哪里放置功能以在类型之间进行转换?

android - Kotlin 泛型属性问题

perl - 用 WSDL 描述 Perl 接口(interface)

regex - 如何在 Perl 中删除 < 和 > 之间的字符?

.net - Sql 连接类 类与模块 - .NET

oop - 里氏原理中的论证逆变如何发挥作用?

javascript - 将简单的 Perl 脚本翻译成 Python 以向客户端发送响应?

perl - 使用带有空格的目录将参数传递给命令行