gpt4 book ai didi

java - 如果公共(public)成员访问私有(private)成员,则不继承私有(private)成员

转载 作者:行者123 更新时间:2023-12-01 17:22:37 26 4
gpt4 key购买 nike

如果这个问题可能一直被问到,我很抱歉,但我进行了搜索,但找不到足够的答案。

如果公共(public)成员/方法正在访问私有(private)成员/字段,如何禁用它们的继承?

所以考虑一下:

public class A {
private MemberA a = new MemberA();

public void foo(TypeA x) {
a.methodCall(); //access to a
}
}

public class B extends A {
private MemberB b = new MemberB();

public void foo(TypeB x) {
b.methodCall();
}
}

如果您点击调试器,您将看到 B 有一个类型为 MemberA 的字段 a。这符合 Java 规则,因为如果公共(public)成员有权访问私有(private)成员,则该成员将被继承。但在 B 中,“a”是无用的,只占用内存 - 即使你不在 B 的构造函数中实例化它,因为 B 调用它的 super 构造函数,并且它必须在 A 中实例化,因为 a 对 a 有很多用途。

需要 A 和 B 具有相同的方法名称,并且它们必须是公共(public)的,但由于它们做的事情根本不同,但也共享共同的逻辑,所以 B 需要从 A 继承。

所以基本上,我需要知道如何同时重载和重写方法。或者重复的代码。该怎么办?

最佳答案

这种情况(类具有您不想继承的数据成员)称为 "Refused Bequest" antipattern ,一般的意思就是你的继承关系是错误的。您需要一个两者独立实现的接口(interface) C,而不是让 B 扩展 A。如果您确实想要共享重要的实现,那么也许您可以引入 A 和 B 可以共享的抽象基类。

关于java - 如果公共(public)成员访问私有(private)成员,则不继承私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com