POO - Como fazer um método virtual?

12 respostas
MrDataFlex

Pessoal,
Bateu esta dúvida…
como seria um método virtual em uma superclasse ?

Abçs!

12 Respostas

Rodrigo_Manhaes

Em Java, todo método é “virtual” por default.

clodoaldoaleixo

Complementando o que o amigo disse, talvez você esteja confundindo com C#, onde explicitamente temos que dizer que determinado método é virtual.

public virtual void metodoX()
MrDataFlex

galera, como eu faço para esta classe funcionar dentro dos conceitos OO

/*


package testes;

/**
 *
 * @author root
 */           //pessoa
public class teste {
    
    /** Creates a new instance of teste */
    public teste() {
    }

    protected String getNome() {  } //AQUI EU NÃO SEI (USARIA VIRTUAL NO C++), COMO FICARIA????????????????


    
}

class fisica extends teste {  
    public fisica() {
         
    }
        private String nome;
   public void setNome(String vNome) {
        nome = vNome;
    }
 
    public String getNome() {
        return nome;
    }
}

class juridica extends teste {
    public juridica() {
        
    }
        private String nome;
    public void setNome(String vNome) {
        nome = vNome;
    }
    public String getNome() {
        return nome;
    }
    
    public static void main (String a[]) {
      teste  t = new juridica();
       // t.getNome();
    }
    

}

protected String getNome() { } //AQUI EU NÃO SEI (USARIA VIRTUAL NO C++), COMO FICARIA????????????????

abraços! ;)

Rodrigo_Manhaes

[quote=clodoaldoaleixo]Complementando o que o amigo disse, talvez você esteja confundindo com C#, onde explicitamente temos que dizer que determinado método é virtual.

public virtual void metodoX()

Não conheço C#, achei que fosse alguma herança do Delphi.

SrFabio

Qual é a diferença de um método virtual e um não virtual? já agora…

Rodrigo_Manhaes

Como eu disse, não precisa fazer nada alem do que você já fez. Em Java os métodos são polimórficos por default.

1112

Se eu entendi, você quer que as classes que herdam de teste implementem o método getNome, certo?

Bem, você pode:

a) declarar teste como uma interface, em vez de uma classe, visto que você não implementa nenhum método lá.

b) declarar teste como uma classe abstrata e declarar o método getNome como abstract.

Em ambos os casos, teste não poderá ser instanciado, e o método getNome deverá ser implementado obrigatoriamente nas subclasses de teste.

Mantu
SrFabio:
Qual é a diferença de um método virtual e um não virtual? já agora..
Em C# pelo menos, até onde eu sei (pouco), se um método de uma classe pai não é virtual e uma classe filha sobrescreve esse método, não rola polimorfismo. Por exemplo:
C#:
namespace zzz{
	public class Pai{
		public void m(){
			Console.WriteLine("Pai");
		}
	}
	
	public class Filha: Pai{
		public void m(){
			Console.WriteLine("Filha");
		}
	}
	
	public class MainClass{
		public static void Main(String[] args){
			Filha filha = new Filha();
			Pai pai = filha;
			filha.m();
			pai.m();
		}
	}
}
A saída vai ser algo assim:
Filha
Pai
Aliás, só o virtual não basta! Se você fizer assim:
C#:
namespace zzz{
	public class Pai{
		public virtual void m(){
			Console.WriteLine("Pai");
		}
	}
	
	public class Filha: Pai{
		public void m(){
			Console.WriteLine("Filha");
		}
	}
	
	public class MainClass{
		public static void Main(String[] args){
			Filha filha = new Filha();
			Pai pai = filha;
			filha.m();
			pai.m();
		}
	}
}
Voc continuará tendo o mesmo resultado... :shock: :shock: :shock: Pro polimorfismo se manifestar direitinho, você tem que dizer que o método lá na pai é virtual, e dizer também que o método na filha é override!!!
C#:
namespace zzz{
	public class Pai{
		public virtual void m(){
			Console.WriteLine("Pai");
		}
	}
	
	public class Filha: Pai{
		public override void m(){
			Console.WriteLine("Filha");
		}
	}
	
	public class MainClass{
		public static void Main(String[] args){
			Filha filha = new Filha();
			Pai pai = filha;
			filha.m();
			pai.m();
		}
	}
}
Aí sim teremos o resultado "esperado"
Filha
Filha
Que tosqueira.... :lol: :twisted:
SrFabio

Já percebi, muito obrigado pela explicação :wink:

johnnyWiller

Desculpe reviver o tópico, mas enfim como eu consigo esse resultado em Java como quando eu tenho em C#, se declarar um método na classe pai como virtual e depois um método na classe filho sobrescreve ele e quando eu chamar o método do pai ele chama na verdade o do filho. Como faço em Java?

E

Em Java todo método de instância é virtual, diferentemente do C#, onde você precisa escrever explicitamente que ele é virtual.

(Se tivesse lido o post completo…)

johnnyWiller

Entanglement mereço aplausos dessa vez kkkk.
Eu até li o post todo mas custei a acreditar, cheguei em casa agora e vi que é isso mesmo! desculpa ai ;D

Criado 2 de abril de 2007
Ultima resposta 11 de abr. de 2013
Respostas 12
Participantes 8