Java,无法降低从对象继承的方法的可见性

Ros*_*sim 14 java oop api

继续这个问题:为什么不能降低Java子类中方法的可见性?

我需要创建B几乎与类相同的类A,除了B不能做某些事情A.

作为一个懒惰的程序员,我试图继承A,只是为了迎接错误,B不能降低A方法的可见性.咄!..

现在A是来自供应商的API,我的目的是封装此API,以便更容易使用.

我想知道解决这个问题的最佳做法是什么?

Gro*_*uez 18

两种选择:

如果您需要B保持相同的接口A(以便客户端代码可以使用这两个中的任何一个而不进行更改),您可以覆盖"禁止"方法B并让它们抛出UnsupportedOperationException.例如:

public class A
{
    public int allowedMethod() { ... }
    public int forbiddenMethod() { ... }
}

public class B extends A
{
    public int forbiddenMethod()
    {
        throw new UnsupportedOperationException("Sorry, not allowed.");
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实希望API成为API的B子集A,那么只需B包含一个实例A,并适当地委托方法调用.

    public class A
    {
        public int allowedMethod() { ... }
        public int forbiddenMethod() { ... }
    }

    public class B
    {
        private A a;

        public int allowedMethod()
        {
            return a.allowedMethod();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是真的.我想这取决于要保留的方法/被拒绝的方法的比例,其中一个解决方案可能看起来比另一个更"干净".例如,如果你只想禁止20个中的2-3个方法,那么A可能看起来更干净.如果您只想保留20种中的2-3种方法,那么B看起来更干净.但是其他一切都是平等的我也倾向于选择B而不是A. (2认同)

Wil*_*iam 9

使用Composition而不是Inheritance.

即,B类持有对A类的引用,并在其上内部调用方法.

  • 我将不得不复制我想要暴露到`B`的'A`中的所有方法,并且有很多它!我没有提到我很懒吗?大声笑.. (2认同)