防止孙子调用其祖父母的方法
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 : Y
、Y : X
。 Z::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::... 的调用,这会导致难以找到错误。
澄清一下,这可能只是我进行重构时的临时更改,以确保我不会遗漏任何内容。
正如您所描述的“重构时”,您可以临时添加一个不完整的类型X
到Z
,它会将超类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
。
【讨论】:
以上是关于防止孙子调用其祖父母的方法的主要内容,如果未能解决你的问题,请参考以下文章