gpt4 book ai didi

java - 为什么 Java 允许增加子类中 protected 方法的可见性?

转载 作者:太空狗 更新时间:2023-10-29 22:49:14 25 4
gpt4 key购买 nike

abstract class Base{
protected abstract void a();
}

class Child extends Base{
@Override
public void a(){
//why is this valid
}
}

为什么我们不能降低能见度但可以提高它?

我还需要实现模板模式,其中可见的公共(public)方法只能是基类。

例子:

abstract class Base{
public void callA(){
//do some important stuff
a();
}

protected abstract void a();
}

class Child extends Base{
@Override
public void a(){
//why is this valid
}
}

现在,如果 java 允许增加可见性,那么有两种公开可见的方法??

我知道接口(interface)是一种解决方案,但还有其他出路吗???

最佳答案

为什么不允许降低可见性已在其他响应中进行了解释(这会破坏父类的契约)。

但是为什么允许增加一个方法的可见性呢?首先,它不会违约,所以没有理由不允许。有时它会很方便,因为在子类中一个方法不 protected 是有意义的。

其次,不允许它可能会产生副作用,有时无法同时扩展类和实现接口(interface):

interface Interface1 {
public void method();
}

public class Parent {
protected abstract void method();
}

public class Child extends Parent implements Interface1 {
@Override
public void method() {
}
//This would be impossible if the visibility of method() in class Parent could not be increased.
}

关于你的第二个问题,你无能为力。您必须相信实现子类的人不会做任何破坏您的实现的事情。即使 java 不允许增加可见性,这仍然不能解决您的问题,因为可以创建具有不同名称的公共(public)方法来调用抽象方法:

class Child extends Base{
@Override
protected void a(){

}

public void a2() {
a(); //This would have the same problems that allowing to increase the visibility.
}
}

关于java - 为什么 Java 允许增加子类中 protected 方法的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12780779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com