【问题标题】:Java grandchild object not allowed to call parent's or grandparent's methodsJava 孙对象不允许调用父母或祖父母的方法
【发布时间】:2012-12-17 19:32:09
【问题描述】:

我在 Java 中有一个 A 类,A 有一些受保护的方法,然后我有一个 B 类,其中 extends 来自 A,因此 B 可以覆盖这些受保护的方法。然后,我希望能够从类B 中拥有一个Cextends,但类C 不应该能够调用A 的受保护方法。在 Java 中可以做到这一点吗?我只是让父类的方法被覆盖并让它们成为最终的吗?例如

public class A()
{
     protected void somemethod();
     protected int somevariable;
}

public class B() extends A
{
    @Override
    final protected void somemethod();
        //How do I make some variable final or not accessible to my children?
    }

    public class C() extends B
    {
        //Now I cannot override somemethod! Is that right?
    }
}

【问题讨论】:

  • 是的,你做对了。你为什么不简单地尝试一下呢?而且你不应该在类名后面有括号。
  • 为什么在类名旁边有一个()?这有效吗(我懒得尝试:D)?
  • 我相信不可能重写一个方法并突然使它成为final。那将是非法覆盖,因为在编译器眼中它不是同一个方法,但它也无法从方法调用中区分调用哪个方法。因此:无效。 (我不太确定,需要检查一下。)
  • @LewsTherin,是的,很抱歉...这不是我的实际代码,eclipse 为我生成类定义,所以我没有类标题的代码...我想我需要更频繁地在文本编辑器中开始编程,这样我才不会太懒:)
  • @11684 不,这是错误的,您可以覆盖一个方法并使其成为最终方法。这在定义接口中的方法时很有用,然后您在抽象类中提供final 实现,以便在所有子类中都可以使用完全相同的行为。这个final 方法可能会调用我们不能调用的hooks 来允许自定义方法。

标签: java inheritance polymorphism


【解决方案1】:

不,您不能阻止子类调用父类的 protected 方法。为此,您必须降低方法的可见性,这是​​不允许的。在您的类B 中创建方法final 仅意味着它不能在任何子类中被覆盖。

您希望禁止对子类调用protected 方法这一事实对我来说似乎是一个设计问题。您可能想查看整个类层次结构的方式,并可能更好地隔离类的责任,这样您就不会陷入必须阻止通常允许的情况(调用 protected 方法)的情况。

【讨论】:

    【解决方案2】:
    //How do I make some variable final or not accessible to my children?
    

    为此,您可以创建一个变量 privatefinal

    private final int COUNT = 100;
    

    private accessor 将阻止您的变量 COUNT 被子类访问。

    【讨论】:

    • 不,在这种情况下,B 类将无法覆盖 A 的方法。
    • @11684:我认为 OP 的问题只是一个变量。
    • 阅读代码 sn-p 中的 cmets 我当然觉得它是关于一种方法的。当我读到它时,问题是:Can I make an overridden method unoverridable for classes extending the overrider.
    • 我在这个问题上不好......当我写它时,我在想“哦不!变量怎么样......?”
    【解决方案3】:

    如果 B 重写受保护的方法以防止 C 访问在 A 中实现的方法就足够了。C 将只能访问在 B 中实现的方法。看看Java How to call method of grand parents?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 2013-06-29
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多