I have a question about interface and class implementing interface.
This is my code:
interface iMyInterface {
public iMethod1();
}
public class cMyClass implements iMyInterface {
public iMethod1() {
// some code
}
protected iMethod2() {
// some code
}
}
I would like to create an instance of iMyInterface
as this :
iMyInterface i = new cMyClass();
i.iMethod1();
It's ok, but how can I call iMethod2()
from my interface instance? Is this working and safe:
((cMyClass)i).iMethod2();
Thanks for help.
Yes, that will work (if you change the declaration of
cMyClass
to implementiMyInterface
) and it's safe so long as the reference really does refer to an instance ofcMyClass
.However, it's a generally bad idea. The whole point of using an interface is to be able to work with any implementation - it's to separate the abstraction from the implementation. If you're then going to require a specific implementation, you might as well make the type of
i
justcMyClass
to start with.So suppose instead of calling the
cMyClass
constructor yourself, you receive a method parameter of typeiMyInterface
- it's a bad idea to cast tocMyClass
at that point, as it could be a different implementation of the interface.(On a separate note, it's a good idea to start following Java naming conventions, which state that classes and interfaces should be Pascal-cased - so ditch the
c
andi
prefixes.)There is some another alternative to cast Interface to a class. Here is example how.
And to get values from your interface, here is the code example.
Output:
Print from cMyClass iMethod1()
Print from cMyClass iMethod2()
I think this is a good example how you can separate interface code from the class code. Just create instance of the interface and every method use through getter with that interface.
It will work (provided that cMyClass implements iMyInterface and you are in scope of protected modifier) but that is not the correct OO approch.
If you want to use iMethod2 consider:
cMyClass myClass = new cMyClass();