Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling method that exists in child classes but not in parent class

public class Parent {
    ....
}

public class Child1 extends Parent {
    ....
    public void foo() {
        ....
    }
}

public class Child2 extends Parent {
    ....
    public void foo() {
        ....
    }
}

Here method foo() only exists in the Child classes and CAN NOT be added to the Parent class (not even abstract method). In this situation when I want to call the foo() method on obj which is Parent class's reference then I need to use intanceof with multiple if..else which I want to avoid.

Parent obj = ...// Object of one of the child classes
obj.foo();

EDIT: I Need to use type of obj as Parent only. Else I will not be able to call methods on obj which exists in Parent class.


My Solution: The approach that I am thinking is to define an interface say FooInterface with foo() method and let all the child classes implement it, then I could just type cast the obj to that interface and call foo() method like this:

if(obj instanceof FooInterface){
    ((FooInterface)obj).foo();
}

Is there a better approach ? Or any improvement to this one?

like image 540
Learner Avatar asked May 06 '14 08:05

Learner


1 Answers

You can't do it with parent object reference until an unless method is declared in parent class/interface itself.

You have to downcast it to child class because parent class/interface doesn't have any knowledge about the child class other than the contract defined between them.

Here contract means abstract methods.


you can try in this way where there is no need to put a check it.

FooInterface sc =new Child1();
sc.foo();

...

interface FooInterface{
    void foo();
}

public class Parent {

}

public class Child1 extends Parent implements FooInterface{

    public void foo() {

    }
}

public class Child2 extends Parent implements FooInterface{

    public void foo() {

    }
}
like image 120
Braj Avatar answered Oct 02 '22 06:10

Braj