POO - Como fazer um método virtual?

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

Abçs!

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

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()

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

[code]/*

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();
}

}[/code]

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

abraços! :wink:

[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.

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

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.

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.

[quote=SrFabio]Qual é a diferença de um método virtual e um não virtual? já agora…
[/quote]
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:

A saída vai ser algo assim:

Filha
Pai

Aliás, só o virtual não basta! Se você fizer assim:

[quote=C#][code]
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();
	}
}

}[/code][/quote]
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!!!

[quote=C#][code]
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();
	}
}

}[/code][/quote]
Aí sim teremos o resultado “esperado”

Filha Filha
Que tosqueira… :lol: :twisted:

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

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?

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…)

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