Bem eu tenho 3 classes com os nomes de A, B e C sendo A é a super classe de todas e C é a subclasse de B o que eu estou querendo é poder chamar os métodos da minha super classe A, mais tem um problema em todas as classes tem o método que eu estou querendo chamar com o mesmo nome
a consequencia disso é que o método da minha subclasse C está sobrescrevendo o método da sua superclasse olhei no google é vi uma maneira de chamar métodos da classe pai sobrescritos vo colocar o código da classe que eu fiz pra ficar mais fácil o entedimento:
packagecom.br.funcionario;publicclassA{publicstaticfinalintID_CLASSE_A=123456;protectedStringnome;protectedStringcpf;protectedStringrg;publicA(){}publicStringgetA(){return"("+this.nome+", "+this.cpf+", "+this.rg;}publicvoidimprimeA(Stringconcatena){System.out.println("Sou a classe A "+concatena);}publicstaticvoidmetodoDaClasseA(){System.out.println("Este é um método da minha classe A");}publicvoidcampoEmComun(){System.out.println("Campo classe A");}}classBextendsA{publicstaticfinalintID_CLASSE_B=654321;privateStringnome;privateStringcpf;privateStringrg;publicB(){}publicStringgetB(){return"("+this.nome+", "+this.cpf+", "+this.rg;}publicvoidimprimeB(Stringconcatena){System.out.println("Sou a classe B "+concatena);}publicstaticvoidmetodoDaClasseB(){System.out.println("Este é um método da minha classe B");}publicvoidcampoEmComun(){System.out.println("Campo classe B");}}classCextendsB{publicstaticfinalintID_CLASSE_C=635241;privateStringnome;privateStringcpf;privateStringrg;publicC(){}publicStringgetC(){return"("+this.nome+", "+this.cpf+", "+this.rg;}publicvoidimprimeC(Stringconcatena){System.out.println("Sou a classe C "+concatena);}publicstaticvoidmetodoDaClasseC(){System.out.println("Este é um método da minha classe B");}publicvoidCampoEmComun(){System.out.println("Campo classe C");}}classTeste{publicvoidmostraCampos(){((A)this).campoEmComun();}publicstaticvoidmain(Stringargs[]){Cc=newC();c.((A)c).campoEmComun();}}
Usa a palavra super que ele usa o membro da classe pai. super.campoComum();
edymrex
Mas não é isso que eu quero fazer cara.
dessa forma vc está chamanddo a superclasse imediata que neste caso é B
o que eu quero é chamar o método da superclasseA esse super referência
a super classe imedianta isso não resolveria meu problema o que eu olhei no google foi o seguinte:
((B),this).campoEmComun();//método campo da classe B
((A),this).campoEmComun();//método campo da classe A
mas não está dando certo não sei porque.
Juliano_Pedroso_da_S
Acredito que só o super não vá adiantar.
Cria um objeto do tipo "private A a" na classe C e quando for estanciar a classe C passa dentro do construtor um objeto do tipo A e cria outro método para chamar da classe A.
Classe C
//1- Cria Objeto do tipo A na classe CprivateAa;//2- Cria esse outro construtor na classe CpublicC(Aa){super();this.a=a;}//3- Cria método para chamar classe A. publicvoidcampoEmComunA(){//Chama Método da classe Aa.campoEmComun();}//4- Continua igual antespublicvoidcampoEmComun(){//Chama Método da classe CSystem.out.println("Campo classe C");}
Jorgev
Eu tou meio verde ainda nesse assunto, mas não seria melhor mudar os nomes dos metodos? Ou não pode fazer isso?
GiancarloBraga
Puppets, entendi sua dúvida e lhe apóio na dúvida pois é minha também.
Também andei estudando orientação a objetos, como herança, polimorfismo, classes abstratas e interface mas ainda não cheguei a imaginar essa situação descrita por você(do C chamar o um método do A). Creio que especificamente essa seria uma dúvida de polimorfismo já que fala-se de overriding.
O que penso é que não dá para acessar o tal método da classe A de forma direta, teria que fazer alguma gambiarra. Da qual alguém mais experiente pode explicar, rsrs, caso seja possível claro.
Abraço.
ramilani12
Puppets:
Bem eu tenho 3 classes com os nomes de A, B e C sendo A é a super classe de todas e C é a subclasse de B o que eu estou querendo é poder chamar os métodos da minha super classe A, mais tem um problema em todas as classes tem o método que eu estou querendo chamar com o mesmo nome
a consequencia disso é que o método da minha subclasse C está sobrescrevendo o método da sua superclasse olhei no google é vi uma maneira de chamar métodos da classe pai sobrescritos vo colocar o código da classe que eu fiz pra ficar mais fácil o entedimento:
packagecom.br.funcionario;publicclassA{publicstaticfinalintID_CLASSE_A=123456;protectedStringnome;protectedStringcpf;protectedStringrg;publicA(){}publicStringgetA(){return"("+this.nome+", "+this.cpf+", "+this.rg;}publicvoidimprimeA(Stringconcatena){System.out.println("Sou a classe A "+concatena);}publicstaticvoidmetodoDaClasseA(){System.out.println("Este é um método da minha classe A");}publicvoidcampoEmComun(){System.out.println("Campo classe A");}}classBextendsA{publicstaticfinalintID_CLASSE_B=654321;privateStringnome;privateStringcpf;privateStringrg;publicB(){}publicStringgetB(){return"("+this.nome+", "+this.cpf+", "+this.rg;}publicvoidimprimeB(Stringconcatena){System.out.println("Sou a classe B "+concatena);}publicstaticvoidmetodoDaClasseB(){System.out.println("Este é um método da minha classe B");}publicvoidcampoEmComun(){System.out.println("Campo classe B");}}classCextendsB{publicstaticfinalintID_CLASSE_C=635241;privateStringnome;privateStringcpf;privateStringrg;publicC(){}publicStringgetC(){return"("+this.nome+", "+this.cpf+", "+this.rg;}publicvoidimprimeC(Stringconcatena){System.out.println("Sou a classe C "+concatena);}publicstaticvoidmetodoDaClasseC(){System.out.println("Este é um método da minha classe B");}publicvoidCampoEmComun(){System.out.println("Campo classe C");}}classTeste{publicvoidmostraCampos(){((A)this).campoEmComun();}publicstaticvoidmain(Stringargs[]){Cc=newC();c.((A)c).campoEmComun();}}
Que erro gerou StackOverFlow?
Me parece impossivel o que vc deseja fazer , vc esta violando o contrato da Classe se vc estendeu de B que estende A o compilador primeiramente chamará o metodo da classe A executará e passara para Classe B e conseqüentemente para C
edymrex
Cara com coerção vc pode chamar métodos da superclasse não imediata tranquilamente desde de que eles não seja sobrescritos.
para métodos de instância:
((A)this).imprimeA();
para métodos da classe:
Cc=newC();((A)c).imprimeA()
Agora para métodos sobrecarregados isso não funciona essa é minha maior dúvida…!
se for da superclasse imediata desse forma funciona: super.campoEmComun();//aki chama da classe B
Achei isso no Livro da Reilly que eu considero excelente muito mais completo que o livro da deitel e vários por ai, mas ele não especifica direito há uma parte do livro que acho importante citar:
fec
Polimorfismo não se aplica a métodos sobrecarregados e sim a sobrescritos!
edymrex
Desculpe minha ignorância mas onde estou utilizando polimorfismo no meu código…?
ramilani12
Se sua classe B não tera implementação no metodo campoEmComun() então adicione somente o super() para que chame o metodo campoEmComun() da Classe A , mas prq vc quer chamar direto da classe C o metodo campoEmComun() da classe A?