如何限制子类修改Abstract类中方法的范围?

时间:2012-07-05 11:52:38

标签: java oop inheritance scope

如何限制Abstract类的实现类将方法范围从protected修改为public?

例如:假设我有一个抽象类

package com.rao.test;

public abstract  class AbstractTEClass {

    protected abstract void function1();

    protected abstract void function2();


    protected void doWork() //I want to call the abstract methods from this method.
    {
        function1(); //implementation classes will give implementation of these methods
        function2();

    }

}

现在,我有一个实现类,它扩展了上面的抽象类

package com.rao.test;

public class AbstractTEClassImpl extends AbstractTEClass {

    @Override
    public void function1() {
        // TODO Auto-generated method stub
        System.out.println("FUnction1");
    }

    @Override
    public void function2() {
        // TODO Auto-generated method stub
        System.out.println("Function2");
    }


    public static void main(String[] args)
    {
        AbstractTEClassImpl objTEClass = new AbstractTEClassImpl();

        objTEClass.doWork();

    }

}

请注意,我正在将实现类中的2个抽象方法的范围从protected更改为public,如何限制我的实现类修改范围。
欢迎任何设计更改或建议或模式。

3 个答案:

答案 0 :(得分:5)

你不能。

覆盖类总是可以提供对方法的更多访问权限,而不是覆盖它的方法。

请在此处阅读有关修饰符的部分http://docs.oracle.com/javase/tutorial/java/IandI/override.html

  

覆盖方法的访问说明符可以允许比重写方法更多但不能更少的访问。例如,超类中的受保护实例方法可以在子类中公开,但不是私有的。

     

如果尝试将超类中的实例方法更改为子类中的类方法,则会出现编译时错误,反之亦然。

答案 1 :(得分:5)

没有办法做到这一点。我也没有看到这一点:如果子类想要使这个方法可访问,为什么不应该呢?它无论如何都不会影响父抽象类的用户。

答案 2 :(得分:3)

你做不到。我怀疑你想要做的是摆弄doWork()所以它可以存在任何滥用扩展类可能在function1和2覆盖内。您可能想要添加方法和/或更改这些方法的功能。

覆盖是一件很方便的事情。我经常对C#工作感到非常恼火,因为微软“密封”了一切以防止覆盖。 (我夸大了;他们只是密封想要覆盖的方法。)不要走那条路。弄清楚你的真正问题是什么,并在你的基础AbstractTEClass类中处理它。