如果公共成员访问私有成员,则不要继承私有成员

Ale*_*ein 0 java inheritance

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

如果私有成员/字段被公共成员/方法访问,如何禁用它们的继承?

所以考虑一下:

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(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你点击调试器,你会看到,B有一个类型为MemberA的字段.这符合Java规则,因为如果公共成员可以访问私有成员,那么它将被继承.但是在B中,"a"是无用的,只是占用内存 - 即使你没有在B的构造函数中实例化它,因为B调用它的超级构造函数并且它必须在A中实例化,因为它非常适用于a.

需要为A和B设置相同的方法名称,并且它们必须是公共的,但由于它们从根本上做了不同的事情但是共享共同的逻辑B需要从A继承.

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

Ern*_*ill 5

这种情况 - 一个类有你不想继承的数据成员 - 被称为"拒绝遗赠"反模式,它通常意味着你的继承关系是错误的.您需要一个独立实现的接口C,而不是让B扩展A. 如果您确实希望共享重要的实现,那么也许您可以引入A和B可以共享的抽象基类.