【问题标题】:Restricting child class from accessing parent class method限制子类访问父类方法
【发布时间】:2014-10-04 06:46:17
【问题描述】:

假设我有一个接口 I 和类 A 和 B。

interface I
{
  method();
}

class A implements I
{
  method()
  { //Implementation 1
  }
}

class B extends A
{
  method()
  { //Implementation 2
  }
}

我想限制 B 访问“方法”。对 b.method() 的调用应始终使用 a.method() 而不是 b.method 实现,其中 a 和 b 分别是 A 和 B 的实例。有什么解决办法吗?

Wish 接口支持另一个访问修饰符来处理此类情况。

【问题讨论】:

  • @stealthjong 接口中的最终方法?
  • 如果“对 b.method() 的调用应该始终使用 a.method()”,那么为什么 B 甚至会覆盖 A 的实现?
  • 抽象适配器怎么样?然后你会有我,抽象类 IAdapter 实现 I 和 A 和 B 扩展 IAdapter。在 IAdapter 中,您实现了 Interface 方法的“强制”实现,并使其成为最终的......只是一个开始。
  • @dcastro 我认为 OP 希望强制所有实现者使用 A 对该接口方法的实现。

标签: java oop interface protected


【解决方案1】:

你可以这样实现 B:

class B extends A
{
  method()
  {
    method(true);
  }

  method(boolean callSuper)
  {
    if (callSuper)
    {
      super.method();
    } else {
      method_impl();
  }

  method_impl()
  {
    //Implementation method of B class
  }
}

【讨论】:

    【解决方案2】:

    正如stealthjong 在他们的评论中提到的那样,您可以通过使A 实现method() final 来实现这一点:

    interface I {
        public void method();
    }
    
    class A implements I {
        public final void method() {
            System.out.println("Hello World!");
        }
    }
    
    class B extends A { }
    

    因为Afinal 修饰符应用于method() 的实现,所以B 无法重新定义它,而是始终调用它从A 继承的版本。

    如果我要写:

    B instance = new B();
    instance.method();
    

    我会看到输出"Hello World!"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2021-07-09
      • 2012-02-15
      • 2012-02-19
      相关资源
      最近更新 更多