Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to restrict child classes from modifying the scope of a method in Abstract class?

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.

like image 623
Rajesh Pantula Avatar asked Jul 05 '12 11:07

Rajesh Pantula


2 Answers

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

The access specifier for an overriding method can allow more, but not less, access than the overridden method. For example, a protected instance method in the superclass can be made public, but not private, in the subclass.

You will get a compile-time error if you attempt to change an instance method in the superclass to a class method in the subclass, and vice versa.

like image 100
Jon Taylor Avatar answered Oct 19 '22 18:10

Jon Taylor


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.

like image 30
JB Nizet Avatar answered Oct 19 '22 19:10

JB Nizet