How can I restrict the implementation class of my Abstract class from modifying the scope of a method from protected to public?
For example : Suppose I have a Abstract Class
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();
}
}
Now, I have a implementation class which extends the above abstract class
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();
}
}
Notice here that I am changing the scope of the 2 abstract methods in the implementation class from protected to public, how can I restrict my implementation class from modifying the scope.
Any design changes or recommendation or patterns are welcome.
You can't. I suspect what you want to do is fiddle with
doWork()
so it can survive any abuse extending classes might do inside the function1 and 2 overrides. You might want to add methods and/or change what those methods do.Overriding is a handy thing. I often get real annoyed working in C# because Microsoft "seals" everything to prevent overriding. (I exaggerate; they only seal the methods I want to override.) Don't go that route. Figure out what your real problem is and handle it in your base AbstractTEClass class.
There is no way to do that. And I don't see the point either: if the subclass wants to make this method accessible, why shouldn't it? It won't affect users of the parent abstract class anyway.
You can't.
An overriding class can always give more access to a method than the method it's overriding.
Read the section on modifiers here http://docs.oracle.com/javase/tutorial/java/IandI/override.html