Raj*_*ula 4 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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个实现类,它扩展了上面的抽象类
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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在将实现类中的2个抽象方法的范围从protected更改为public,如何限制我的实现类修改范围.
欢迎任何设计更改或建议或模式.
你不能.
覆盖类总是可以提供对方法的更多访问权限,而不是覆盖它的方法.
阅读http://docs.oracle.com/javase/tutorial/java/IandI/override.html上的修饰符部分
覆盖方法的访问说明符可以允许比重写方法更多但不是更少的访问.例如,超类中的受保护实例方法可以在子类中公开,但不是私有的.
如果尝试将超类中的实例方法更改为子类中的类方法,则会出现编译时错误,反之亦然.
没有办法做到这一点.我也没有看到这一点:如果子类想要使这个方法可访问,为什么不应该呢?它无论如何都不会影响父抽象类的用户.
你不能。我怀疑你想要做的是摆弄,doWork()这样它就可以在 function1 和 2 重写中可能发生的任何滥用扩展类中幸存下来。您可能想要添加方法和/或更改这些方法的用途。
覆盖是一件很方便的事情。我经常对 C# 工作感到非常恼火,因为微软“密封”了所有内容以防止覆盖。(我夸大了;他们只密封了我想要重写的方法。)不要走那条路。找出你真正的问题是什么,并在你的 AbstractTEClass 基类中处理它。