Chamando métodos da classe superior

11 respostas
edymrex

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:

package com.br.funcionario;

public class A
{
	public static final int ID_CLASSE_A=123456;
	protected String nome;
	protected String cpf;
	protected String rg;
	
	
	 
	public A()
	{
		
	}
	 
	
	public String getA()
	{
		return "("+this.nome+", "+this.cpf+",  "+this.rg;
	}
	
	public void imprimeA(String concatena)
	{
		System.out.println("Sou a classe A "+concatena);
	}
	
	public static void  metodoDaClasseA()
	{
		System.out.println("Este é um método da minha classe A");
	}
	
	public void campoEmComun()
	{
		System.out.println("Campo classe A");
	}
	
	
}

class B extends A
{
	public static final int ID_CLASSE_B=654321;
	private String nome;
	private String cpf;
	private String rg;
	 
	public B()
	{
		
	}
	 
	
	public String getB()
	{
		return "("+this.nome+", "+this.cpf+",  "+this.rg;
	}
	
	public void imprimeB(String concatena)
	{
		System.out.println("Sou a classe B "+concatena);
	}
	public static void  metodoDaClasseB()
	{
		System.out.println("Este é um método da minha classe B");
	}
	
	public void campoEmComun()
	{
		 
		System.out.println("Campo classe B");
	}
	
	
}

class C extends B
{
	public static final int ID_CLASSE_C=635241;
	private String nome;
	private String cpf;
	private String rg;
	 
	public C()
	{
		
	}
	 
	
	public String getC()
	{
		return "("+this.nome+", "+this.cpf+",  "+this.rg;
	}
	
	public void imprimeC(String concatena)
	{
		System.out.println("Sou a classe C "+concatena);
	}
	
	public static void  metodoDaClasseC()
	{
		System.out.println("Este é um método da minha classe B");
	}
	
	public void CampoEmComun()
	{
		
		System.out.println("Campo classe C");
	}
	
	
}

class Teste
{
	
	
	public void mostraCampos()
	{
		((A) this).campoEmComun();
	}
	public static void main(String args[])
	{
		
		C c= new C();
		c.
		 
		
		((A) c).campoEmComun();
		 
		
	}
}
Reparem que em todas as classes tem o método campoEmComun()

nesse caso tenho que fazer uma  coerção para chamar da super classe A seria mais ou menos assim:

((A) this).campoEmComun();

ou em um método da classe

((A) c).campoEmComun();

mais está dando erro alguém pode me ajudar neste caso??

11 Respostas

antoniopopete

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 C
private A a;

//2- Cria esse outro construtor na classe C
 public C(A a){

         super();
         this.a = a;
}

//3- Cria método para chamar classe A. 
public void campoEmComunA(){
       //Chama Método da classe A
       a.campoEmComun();
}

//4- Continua igual antes
public void campoEmComun(){
       //Chama Método da classe C
       System.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:

package com.br.funcionario;

public class A
{
	public static final int ID_CLASSE_A=123456;
	protected String nome;
	protected String cpf;
	protected String rg;
	
	
	 
	public A()
	{
		
	}
	 
	
	public String getA()
	{
		return "("+this.nome+", "+this.cpf+",  "+this.rg;
	}
	
	public void imprimeA(String concatena)
	{
		System.out.println("Sou a classe A "+concatena);
	}
	
	public static void  metodoDaClasseA()
	{
		System.out.println("Este é um método da minha classe A");
	}
	
	public void campoEmComun()
	{
		System.out.println("Campo classe A");
	}
	
	
}

class B extends A
{
	public static final int ID_CLASSE_B=654321;
	private String nome;
	private String cpf;
	private String rg;
	 
	public B()
	{
		
	}
	 
	
	public String getB()
	{
		return "("+this.nome+", "+this.cpf+",  "+this.rg;
	}
	
	public void imprimeB(String concatena)
	{
		System.out.println("Sou a classe B "+concatena);
	}
	public static void  metodoDaClasseB()
	{
		System.out.println("Este é um método da minha classe B");
	}
	
	public void campoEmComun()
	{
		 
		System.out.println("Campo classe B");
	}
	
	
}

class C extends B
{
	public static final int ID_CLASSE_C=635241;
	private String nome;
	private String cpf;
	private String rg;
	 
	public C()
	{
		
	}
	 
	
	public String getC()
	{
		return "("+this.nome+", "+this.cpf+",  "+this.rg;
	}
	
	public void imprimeC(String concatena)
	{
		System.out.println("Sou a classe C "+concatena);
	}
	
	public static void  metodoDaClasseC()
	{
		System.out.println("Este é um método da minha classe B");
	}
	
	public void CampoEmComun()
	{
		
		System.out.println("Campo classe C");
	}
	
	
}

class Teste
{
	
	
	public void mostraCampos()
	{
		((A) this).campoEmComun();
	}
	public static void main(String args[])
	{
		
		C c= new C();
		c.
		 
		
		((A) c).campoEmComun();
		 
		
	}
}
Reparem que em todas as classes tem o método campoEmComun()

nesse caso tenho que fazer uma  coerção para chamar da super classe A seria mais ou menos assim:

((A) this).campoEmComun();

ou em um método da classe

((A) c).campoEmComun();

mais está dando erro alguém pode me ajudar neste caso??</blockquote>

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:

C c = new C();
((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?

edymrex

É soh por curiosidade mesmo cara!

Criado 9 de agosto de 2007
Ultima resposta 9 de ago. de 2007
Respostas 11
Participantes 7