防止孙子调用其祖父母的方法

Posted

技术标签:

【中文标题】防止孙子调用其祖父母的方法【英文标题】:Prevent grandchild calling its grandparent's methods 【发布时间】:2021-01-29 14:55:42 【问题描述】:

我有一个简单的父类和基类:

class X

public:
 virtual void Method()...
;

class Z : public X

public:
 virtual void Method() X::Method(); 
;

我想重构这个,所以一个新类 Y 位于类层次结构之间,所以 Z : YY : XZ::Method() 现在应该调用 Y::Method() 而不是 X::Method()。但是如果我不改变它,它仍然可以编译。事实上,我有很多这样的方法,在重构时很容易错过对X::... 的调用,这会导致难以发现的错误。

有没有办法让编译器提醒我,换句话说,使Y 可以访问X 的方法,但对Z 隐藏?

澄清一下,这可能只是我进行重构以确保不会遗漏任何内容时的临时更改。

【问题讨论】:

通常的答案:作曲?还是私人继承?也许有点上下文会很好,为什么你需要这个。 @idmean 但是Y 必须为X 中的每个方法实现传递方法,它不会覆盖...? 因此您希望 Y 以 Z 无法再调用它们的方式覆盖 X 中的方法。我说对了吗? 如果您希望X 的方法对Y 可用但对Z 隐藏,您可以将它们从public 更改为private 但将Y 设为@ 987654340@上课。我不建议永久保持这种状态,但如果你的目标是清除这种行为,它就会产生这种效果。 @idmean 不,我要确保所有Z 调用X 中的超类方法的地方都更新为调用Y 【参考方案1】:

但如果我不更改它,它仍然可以编译。事实上,我有很多这样的方法,在重构时很容易错过对 X::... 的调用,这会导致难以找到错误。

澄清一下,这可能只是我进行重构时的临时更改,以确保我不会遗漏任何内容。

正如您所描述的“重构时”,您可以临时添加一个不完整的类型XZ,它会将超类X 隐藏在层次结构中:

class Z : public Y 
private:
    struct X;  // TODO(Mr. Boy): remove after finishing re-factoring.
public:
    void Method() override  X::Method();   // error! Z::X is incomplete
;

Z 中对X::... 的任何合格使用都将失败,因为查找解析为不完整的嵌套类型X

【讨论】:

以上是关于防止孙子调用其祖父母的方法的主要内容,如果未能解决你的问题,请参考以下文章

在允许孩子捕捉触摸的同时防止父母被点击

防止孩子走丢,除了定位手机这些方法值得收藏

防止父母李+李携带给孩子

防止键盘事件在 Flutter 中冒泡(传播给父母)

如何防止拖累孩子,但允许拖累父母?

防止绝对孩子扩展父母