【问题标题】:How to inherit from a base class but make some of public methods from the base class private in the derived class? [duplicate]如何从基类继承,但在派生类中将基类的一些公共方法设为私有? [复制]
【发布时间】:2019-06-10 21:10:30
【问题描述】:

例如,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();
         }
    };

【问题讨论】:

  • 您显示的代码中没有继承。你是什​​么意思,你想让一个继承的方法“私有”?这是不可能的
  • 在派生类中将继承的公共方法设为私有是没有意义的。派生类必须能够替代基类。如果由于可见性限制,基类中的方法不再可用,这将不起作用。
  • 这是组合(例如非常简单的外观或适配器),而不是继承。

标签: java


【解决方案1】:

您不能降低继承自的方法的可见性

所以如果超级方法是公共的,你不能减少到受保护的或私有的

这个问题已经涵盖了它:Cannot reduce visibility of method inherited method from parent

【讨论】:

  • 如果您添加问题以获取更多信息,这应该是评论,而不是答案
  • @sp00m 注意到了,谢谢
【解决方案2】:

您不能从类继承并降低继承方法的可见性。另一方面,您显示的代码没有使用继承。如果您需要扩展一个类(以便从基类继承所有状态和行为),但又不想将所有继承的方法公开为公共,这里有一种方法:

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的类的实现封装在一个新Derived类的private final字段中,该类只公开foo方法,同时保留bar方法@987654327 @。这个匿名内部类只是委托给Derived 类的方法。作为一项额外的安全措施,我们还制作了Derivedfinal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2016-10-08
    • 2011-01-02
    • 2017-04-14
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多