例如,Base类有两个公共方法:foo()和bar()。派生类继承自Base类(我不能修改该类,因为它在我使用的库中)。
在派生类中(在我的应用程序中),我想将foo()公开,但将bar()私有。以下代码是正确的自然方法吗?我没有扩展它,而是创建一个对象并仅访问所需的方法。
class Base {
public void foo();
public void bar();
};
public class Derived {
private Base base;
public void bar() {
base.bar();
}
};
答案 0 :(得分:1)
您不能降低从其继承的方法的可见性
因此,如果超级方法是公共方法,则不能简化为受保护或私有方法
这个问题已经解决了:Cannot reduce visibility of method inherited method from parent
答案 1 :(得分:0)
您不能从类继承并降低所继承方法的可见性。另一方面,您所显示的代码没有利用继承。如果您需要扩展一个类(以便从基类继承所有状态和行为),但又不想将所有继承的方法公开为公共方法,则可以使用以下方法:
public final class Derived {
private final Base base = new Base() { // extending base class here
@Override
public void foo() {
Derived.this.foo();
}
@Override
public void bar() {
Derived.this.bar();
}
};
public void foo() {
// Implement foo here
}
private void bar() {
// Implement bar here
}
}
因此,我们的想法是将扩展Base
的类的实现封装在新的private final
类的Derived
字段中,该类仅公开foo
方法,而保持bar
方法private
。该匿名内部类仅委托Derived
类的方法。作为一项额外的安全措施,我们还将制作Derived
类final
。