Continuing from this question: Why can't you reduce the visibility of a method in a Java subclass?
I need to create class B
that is almost identical to class A
, except that B
cannot do certain things that A
can.
Being a lazy programmer as I am, I tried to inherit A
, only to greet with error that B
cannot reduce the visibility of A
methods. Duh!..
Now A
is an API from a vendor, my intention is to encapsulate this API so that it is easier to use.
I wonder what is the best practice to work around this?
You cannot reduce the visibility of a inherited method. Here parent class has func() method which is public and overridden by the subclass TestClass which is private.
Yes, an overridden method can have a different access modifier but it cannot lower the access scope. Methods declared public in a superclass also must be public in all subclasses. Methods declared protected in a superclass must either be protected or public in subclasses; they cannot be private.
To override an inherited method, the method in the child class must have the same name, parameter list, and return type (or a subclass of the return type) as the parent method. Any method that is called must be defined within its own class or its superclass.
Two options:
If you need B
to keep the same interface as A
(so that client code can use any of the two without changes), you can override "forbidden" methods in B
and have them throw an UnsupportedOperationException
. For example:
public class A
{
public int allowedMethod() { ... }
public int forbiddenMethod() { ... }
}
public class B extends A
{
public int forbiddenMethod()
{
throw new UnsupportedOperationException("Sorry, not allowed.");
}
}
Or, if you really want the API of B
to be a subset of the API of A
, then just have B
contain an instance of A
, and delegate method calls appropriately.
public class A
{
public int allowedMethod() { ... }
public int forbiddenMethod() { ... }
}
public class B
{
private A a;
public int allowedMethod()
{
return a.allowedMethod();
}
}
Use Composition rather than Inheritance.
i.e. class B holds a reference to a class A and internally calls methods on it.
A facade is used when one wants an easier or simpler interface to work with.
You would have to create your own wrapper class (Facade Pattern) around your foreign interface.
interface Foreign
{
void dontWantThis();
void keepThis();
}
interface/class MyForeign
{
void keepThis();
}
The implementation would then have a instance of Foreign that it can refer calls to.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With