Métodos virtuais
Um método virtual
permite que sejam definidas implementações padrão para classes abstract
(abstratas) e permitem que uma classe filha sobreponha seu comportamento, isso é diferente de esconder métodos.
public abstract class Discador : GLib.Object {
public abstract string nome { get; protected set; }
public abstract void atualizar (string novo_nome);
public virtual bool restaurar ()
{
nome = "Sem nome";
return true;
}
}
public class ContatoCV : Discador
{
public override string nome { get; protected set; }
public override void atualizar (string novo_nome)
{
nome = "ContatoCV - " + novo_nome;
}
public override bool restaurar ()
{
nome = "ContatoCV-Nome";
stdout.printf ("CotatoCV.restaurar () implemetação!\n");
return true;
}
}
public class Contato : Discador {
public override string nome { get; protected set; }
public override void atualizar (string novo_nome)
{
name = "Contato - " + novo_nome;
}
public static void main ()
{
var c = new Contato ();
c.atualizar ("John Strauss");
stdout.printf(@"Nome: $(c.nome)\n");
c.restaurar ();
stdout.printf(@"Restaurar Nome: $(c.nome)\n");
var cv = new ContatoCV ();
cv.atualizar ("Xochitl Calva");
stdout.printf(@"Nome: $(cv.nome)\n");
cv.restaurar ();
stdout.printf(@"Restaurar Nome: $(cv.nome)\n");
stdout.printf("FIM\n");
}
}
Como você pode ver no exemplo acima, Discador
é uma classe abstrata(abstract
) definindo uma propriedade abstrata e um método abstrato, mas adiciona um método virtual
que pode ser sobreposto pela classe derivada. A classe Contato
implementa métodos e propriedades abstratas de Discador
, enquanto usa a implementação padrão de restaurar()
por não definir uma nova. A classe ContatoCV
implemeta todas as definições abstratas do Discador
, mas sobrepõe restaurar()
para definir uma implementação própria.