How to override methods with different arguments? - java

I have several subControllers like below. I want to force developers to override run methods based on their needs. I mean all classes that extends MainController must override either run() or run(String command) methods. Is there any way to do this?
I have a base class called MainController
public abstract class MainController{
public abstract void run();
public abstract void run(String command);
}
public class Sub1Controller extends MainController{
public void run(){ //Some Codes Here }
public void run(String command) {} //empty method here
}
public class Sub2Controller extends MainController{
public void run(){} //empty method here
public void run(String command) { //Some Codes Here }
}
EDIT: Above example nearly solves my problem but I don't want to put empty methods everywhere.

You can't force a developer to implement one abstract method without having to implement others as well. You can provide empty default implementations though and let the dev override when needed:
//making the class abstract forces the dev to subclass it but not to override any method,
//which might not be necessary anyways.
public abstract class MainController{
public void run() { }
public void run(String command) {}
}
public class Sub1Controller extends MainController{
#Override
public void run(){ /*override only this method*/ }
}
Forcing a developer to only override one method but not the other isn't really possible at all. The problem is that every concrete class needs to implement every method and thus you have to provide implementations - either by providing them by default or by forcing the developer to provide them even if they're not needed.
However, your question indicates a design flaw: if the dev would only be required to implement one of those methods how would you make sure the correct one (the one that's being called) is overridden? You could theoretically call both but how would you prevent the dev from providing implementations for / overriding both methods?
Thus a different design might be better suited. Proposing one is hard though without knowing more of the context. One way might be to provide only one method that takes a parameter object that represents all possible parameters and let the dev decide which parameters to use. Another option might be to use multiple interfaces (each containing one method) and let the dev implement those (albeit they could still implement multiple interfaces in the same class).
Example of option 1 (one method only) using generics:
public interface Command {}
public interface MainController<T extends Command> {
public void run( T command );
}
public class Sub1Command implements Command { ... }
public class Sub1Controller implements MainController<Sub1Command> {
public void run( Sub1Command command ) { ... }
}
In the example I'm using generics to define the type of command parameter being passed. Thus the implementation can define which type of commands the run() method should accept (calling might be a bit more complex but again the context is missing).
To support a method similar to run() you could provide an empty implementation like VoidCommand implements Command and then Sub2Controller implements MainController<VoidCommand>.

The question is: Why do you need both versions of that method in your interface?
I suspect that this is w wrong understanding of ease of use.
The much more convenient solution would be to provide a special NO_COMMAD constant for the cases the command is not needed:
public interface MyInterface {
public static final String NO_COMMAD = "";
public void run(String command);
}
This solves your problem of having alternative method signatures.
The even betetr possibility would be to create different interfaces where one has a parameter in the methos signature and the other has not:
public interface MyInterfaceWithParam {
public void run(String command);
}
public interface MyInterfaceWithoutParam {
public void run();
}

Related

How to properly declare an interface method possibly unsupported by some implementations?

This is a logical development of another question I asked.
Supposedly you have an interface, some methods of which might either be supported by a concrete implementation or not. The goal is to provide a reasonable way for the client to find out whether his particular implementation supports each particular method and to recover if it doesn't.
The solution I came up with utilizes the standard java.lang.UnsupportedOperationException, which is thrown by the concrete implementation if the method is unsupported:
public interface CommonInterface {
void possiblyUnsupportedOperation () throws java.lang.UnsupportedOperationException;
}
However, this is claimed to be a bad solution, since the exception mechanism should not be used as a means of checking whether an operation is available. So the alternative suggestion is to use tester methods:
public interface CommonInterface {
void possiblyUnsupportedOperation ();
boolean isOperationSupported ();
}
But what if the interface has a whole multitude of optional operations? Should I use multiple tester functions? Should I create a separate Enum to map the optional methods onto and pass it as a method descriptor to a single tester function? Both variants look kinda clunky to me.
Is there an alternative way that is both an elegant code and a good design solution?
If you own that interface you could extract a Parent interface with the methods that are always going to be implemented and inherit from that interface.
public interface ParentCommonInterface {
void method1();
void method2();
}
public interface CommonInterface extends ParentCommonInterface {
void possiblyUnsupportedOperation();
}
class MyClass implements ParentCommonInterface {...}
If you don't own that interface you can create an Adapter class and use that one to declare the object.
public interface CommonInterface {
void possiblyUnsupportedOperation();
boolean isOperationSupported();
}
public class AdapterClassOne implements CommonInterface {
void possiblyUnsupportedOperation() {...}
boolean isOperationSupported() {return false;}
}
}

Define and execute partial functions of an interface

I am new to Java so i have some obvious (to some of you) questions about declaration, definition and execution of some functions.
Suppose you have declared two methods in an interface and you want to define the behavior of the first function in a (abstract?) class and the second function in another (abstract?) class.
Is there a way to define two methods in two separate classes? For example i could have a lot of methods in an interface but I want to implement just one of them because a specific object does not needs the others. How can I do that??
Java Code example :
interface DeclareFcnts {
void foo1();
void foo2();
}
abstract class Define_fcn1 implements DeclareFcnts {
public void foo1() {
// TODO Auto-generated method stub
}
}
abstract class Define_fcn2 implements DeclareFcnts {
public void foo2() {
// TODO Auto-generated method stub
}
}
class Myclass {
public static void main(String args[]) {
// How can i create an object that reference to the first function only?
}
}
If you implement an interface in a class, you must assume it will have all the interface methods declared. You must define what happens if any of these methods are invoked. Consider this:
DeclareFcnts instance = new Define_fcn1();
instance.foo2(); // what happens here?
What is your expected behavior on the second line? It could throw an exception, do nothing, (or return a value if the method wasn't void).
One option is to define the behavior in the concrete implementing class (because you cannot instantiate abstract classes), which is what you would like to avoid. Fortunatelly, in Java 8, there is another way - using default methods:
interface DeclareFcnts {
default void foo1() { /* default implementation, e.g. throw or do nothing */ }
default void foo2() { /* default implementation, e.g. throw or do nothing */ }
}
class Define_fcn1 implements DeclareFcnts {
public void foo1() { /* do something */ }
}
In this case, Define_fcn1 will inherit implementation of foo2 from DeclareFcnts much like if it inherited from a super class. You can notice that the class no longer needs to be abstract.
That said, you should try to avoid such situations. They will make unit testing, refactoring, etc., more difficult. You may possibly split your interface into multiple interfaces. If you need both methods somewhere, you can pass the interfaces separately, or, if absolutely necessary, define another interface like this:
interface Foo1Iface { void foo1(); }
interface Foo2Iface { void foo2(); }
interface BothIface extends Foo1Iface, Foo2Iface { }
I would avoid it if possible, though. You may get more suggestions if you add more details to your answer.
AFAIK it is not possible, when you are implementing an interface you are obliged to #override those methods in that interface but you can leave it as blank assuming that you would not call it. Although:
This is your Generic interface, it can be anything as long as you meet the requirements.
Credits to Pinterest.
If you are going to design a house it does not make sense to add a wheel or anything unrelated to the house. Otherwise create a separate Interface for a Car or a Bus.
An Example of Bad Design
interface GenericInterface{
public void defineDoor();
public void defineWindow();
public void defineWheel();
}
The actual implementation
class House implements GenericInterface{
#Override
public void defineDoor{
// do something
}
#Override
public void defineWindow{
// do something
}
#Override
public void defineWheel{
// does not make sense to the House.
}
}
Here is another class that implements the Generic Interface
class Car implements GenericInterface{
#Override
public void defineDoor{
// do something
}
#Override
public void defineWindow{
// do something
}
#Override
public void defineWheel{
// do something.
}
}
Though our Car fits the above Interface but since when did the House contains a wheel?. The right way to do this is to create Separate Interface for Car and House.
You can not do this!
you must declare body for your method that declared in interface and then create instance of class
or you can use java 8 default declaration for your interface methods
for example:
public interface IX
{
void sayHello();
void sayBye();
default void showInfo()
{
System.out.println("you call show Info method");
}
}

Override interface with different signature

I have the following problem:
an Interface with a simple listener, inerithed from a library:
public interface RequestListener<RESULT> {
void onRequestFailure(FooException fooException);
void onRequestSuccess(RESULT result);
}
a class who extends FooException:
public class MyCustomFooException extends FooException {
. . .
}
}
and I need to overload the signature of the onRequestFailure method with my custom class.
something like this:
public interface MyCustomListener<RESULT> extends RequestListener<RESULT> {
#Override
public void onRequestFailure(MyCustomFooException e);
#Override
public void onRequestSuccess(RESULT result);
}
how can i do that?
You could use another typed Parameter to your interface :
public interface RequestListener<RESULT,T extends FooException> {
void onRequestFailure(T fooException);
void onRequestSuccess(RESULT result);
}
Then when you implement your interface, you can define :
public interface IglooListener<RESULT> extends RequestListener<RESULT,MyCustomFooException> {
#Override
public void onRequestFailure(MyCustomFooException e);
#Override
public void onRequestSuccess(RESULT result);
}
You cannot do that (in a class). If you do it, you're no longer implementing the RequestListener interface. You need to use the exact same signature from the
interface: void onRequestFailure(FooException fooException);
If you do it in an interface and if you use another signature, you're extending the original interface by just adding a new method to it. If a non-abstract class later on implements the extended IglooListener interface, it will have to define both methods.
Just remove the #Override from the method in IglooListener interface. you will be good to go. In that case you will be having two methods in IglooListener one from the RequestListener and other one from the IglooListener. Hope this helps.
Unfortunately, this is not possible in Java because your inheriting class would narrow the possible input parameter types to a subset originally allowed and could therefore not behave like the original interfaced intended to.
EDIT Just like the other answers state, you can add a method with this signature, but it would not override the interface method.

How to use abstract methods linked with enforced call for other methods

I am facing the following problem:
I defined an abstract class that contains the public generate, clone, etc. methods that must be implemented by the subclass. However I would like to ensure that when these public methods are called certain other methods are also executed within the abstract class.
An obvious solution would be to make a protected abstract method to be implemented and a public non-abstract method that calls the abstract one and all the other methods that I need.
For example:
abstract class Representation {
public void generate(int variable) {
myFunction();
generateAbstract(variable);
}
protected abstract void generateAbstract(int variable);
private void myFunction() {
//do something
}
}
My question is how to solve it a nicer way, or if this is the way to go how to name the function in a user-friendly way.
Thanks!
Your way of solving this issue is so standard that it even has a name: it is called Template Method Pattern. The idea is to provide a public method that executes the steps of your algorithm at high-level, and use overrides of protected abstract methods in subclasses to deal with lower-level steps of the algorithm. This is the correct way of addressing the problem.
I would do it as you are doing it. I would make the wrapper method either
final so I can't be blown away in a subclass, or
document the hell out of the methods, indicating that the abstract method MUST be called...
#dasblinkenlight's answer identifies the design pattern that addresses your problem: Template Method. I like this Template Method link more than the wikipedia entry that answer references. Also, I like answers with code examples:
// Demonstrate the template method design pattern
// straight out of GoF example
abstract class AbstractClass {
// Final ensures extender does not override, but depends on your design
final void templateMethod() {
primitiveOperation1();
primitiveOperation2();
}
// document extenders should keep as protected
// so clients do not call directly
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
}
public class ConcreteClass extends AbstractClass {
#Override
protected void primitiveOperation1() {
System.out.println("ConcreteClass.primitiveOperation1()");
}
#Override
protected void primitiveOperation2() {
System.out.println("ConcreteClass.primitiveOperation2()");
}
}
I think your suggested method is quite elegant enough. I've certainly solved the same problem in this way before. I'd possibly call your method doGenerate() (or something without the word Abstract in it).
I think the easiest way to do this would be to ensure that super.generate is called. Since Java doesn't have a good mechanism for informing a class of when it has been subclassed (others like Ruby do), there's not much you can do to force a subclass that implements an abstract method to call another method.
As pointed out before, what you suggested is the correct approach according to the Template method pattern. What is left is the naming issue. I would not call the function to be overwritten "generateAbstract" because when it is implemented it is not abstract anymore. I recommend something like "makeGenerate()" which reflects the original function and implies what it does.
abstract class Representation {
public void generate(int variable) {
myFunction();
makeGenerate(variable);
}
protected abstract void generateAbstract(int variable);
private void myFunction() {
//do something
}
}
public class ConcreteClass extends Representation {
#Override
protected void makeGenerate() {
...
}

not implementing all of the methods of interface. is it possible?

Is there any way to NOT implement all of the methods of an interface in an inheriting class?
The only way around this is to declare your class as abstract and leave it to a subclass to implement the missing methods. But ultimately, someone in the chain has to implement it to meet the interface contract. If you truly do not need a particular method, you can implement it and then either return or throw some variety of NotImplementedException, whichever is more appropriate in your case.
The Interface could also specify some methods as 'default' and provide the corresponding method implementation within the Interface definition (https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html). These 'default' methods need not be mentioned while implementing the Interface.
The point of an interface is to guarantee that an object will outwardly behave as the interface specifies that it will
If you don't implement all methods of your interface, than you destroy the entire purpose of an interface.
We can override all the interface methods in abstract parent class and in child class override those methods only which is required by that particular child class.
Interface
public interface MyInterface{
void method1();
void method2();
void method3();
}
Abstract Parent class
public abstract class Parent implements MyInterface{
#Override
public void method1(){
}
#Override
public void method2(){
}
#Override
public void method3(){
}
}
In your Child classes
public class Child1 extends Parent{
#Override
public void method1(){
}
}
public class Child2 extends Parent{
#Override
public void method2(){
}
}
I asked myself the same question, and then learned about Adapters. It solved my problem, maybe it can solve yours. This explains it very well : https://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters
You can do that in Java8. Java 8 introduces “Default Method” or (Defender methods) new feature, which allows a developer to add new methods to the Interfaces without breaking the existing implementation of these interfaces.
It provides flexibility to allow Interface define implementation which will use as default in the situation where a concrete Class fails to provide an implementation for that method.
interface OldInterface {
public void existingMethod();
default public void DefaultMethod() {
System.out.println("New default method" + " is added in interface");
}
}
//following class compiles successfully in JDK 8
public class ClassImpl implements OldInterface {
#Override
public void existingMethod() {
System.out.println("normal method");
}
public static void main(String[] args) {
ClassImpl obj = new ClassImpl ();
// print “New default method add in interface”
obj.DefaultMethod();
}
}
Define that class as an abstract class. However, you must implement those unimplemented methods when you want to create an instance of it (either by using a subclass or an anonymous class).
It is possible and it is easy. I coded an example.
All you have to do is inherit from a class that does implement the method. If you don't mind a class that is not instantiable, then you can also define an abstract class.
If you want an instantiable class, it is not possible. You may try to define an abstract class, though.
If you try to implement an interface and you find yourself in a situation where there is no need to implement all of them then, this is a code smell. It indicates a bad design and it violates Liskov substitution principle. Often this happens because of using fat interface.
Also sometimes this happens because you are trying to implement an interface from an external dependency. In this case, I always look inside the source code to see if there is any implementation of that interface which I can either use it directly or subclass it and override methods to my needs.
We can use Adapter classes ,which reduces complexcity by not making mandatory to implement all the methods present in the interface
Adapter class is a simple java class that implements an interface with only EMPTY implementation .
Instead of implementing interface if we extends Adapter class ,we provide implementation only for require method
ex--- instead of implementing Servlet(I) if we extends GenericServlet(AC) then we provide implementation for Service()method we are not require to provide implementation for remaining meyhod..
Generic class Acts as ADAPTER class for Servlet(I).
yes possible below shown is the way
interface Test {
void m() throws NullPointerException;
}
class Parent {
// Parent class doesn't implements Test interface
public void m() {
System.out.println("Inside Parent m()");
}
}
class Child extends Parent implements Test {
}
public class Program {
public static void main(String args[]) {
Child s = new Child();
s.m();
}
}

Categories