none
duvida cruel metodos virtual e override RRS feed

  • Pergunta

  • Pelo que entendi metodos override substituem metodos virtual... posso usar um metodo ja existente na classe pai e fazer com que ele funcione de forma diferente na classe filho... ok isso eu entendi!!!!

     eu não consigo entender é pq o codigo abaixo funciona tanto com virtual e override como se eu remover estes modificadores o programa executa da mesma forma!!! não era para dar erro?? se funciona para quer colcoar virtual e override.?? não consegui entender bem essa logica ... sera que posso ter o mesmo metodo em classes diferentes sendo q b herda de A ? alguem poderia transformar o meu exemplo em um codigo que nao funcione sem o virtual e override?

    obrigado.

     

     public class A
    
        {  public virtual void exibe()
    
            {
    
                System.Console.WriteLine("A");
    
            }
    
        }
    
        public class B : A
    
        {   public override void exibe()
    
            {
    
                System.Console.WriteLine("B");           
    
            }
    
        }
    
       public  class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                B bbb = new B();
    
                bbb.exibe();
    
    
    
                System.Console.ReadLine();
    
            }
    
        }
    
    

     


    • Editado Filipibh quarta-feira, 21 de setembro de 2011 14:31
    quarta-feira, 21 de setembro de 2011 14:29

Respostas

  • Amigo, métodos virtuais, sobrescrição dos mesmos e Polimorfismo são caractéristicas da Orientação a Objeto. A virtualização de métodos é uma das caracteristicas que torna o polimorfismo algo tão poderoso, por isso eles sempre andarão juntos. 

    Apartir do momento que você está usando herança, se bem definido, eu não vejo o por que de sobrescrever um método virtual sem que ele seja o da classe pai e ainda assim herdando ele. Se for para ser diferente, não herde da classe pai, ou, implemente uam interface com o que lhe interessa em ter de métodos a serem construidos pelas classes que a implementam.

     


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Paulo César Viana quarta-feira, 28 de setembro de 2011 13:36
    • Marcado como Resposta Filipibh quarta-feira, 28 de setembro de 2011 17:14
    quarta-feira, 28 de setembro de 2011 13:14
    Moderador

Todas as Respostas

  • Acho esta explicação mais esclarecedora:

    http://msdn.microsoft.com/en-us/library/ebca9ah3%28v=vs.71%29.aspx


    Uma ótima definição " Virtual e Override – Com o uso da palavra-chave virtual (destinada a métodos, propriedades, indexadores e eventos), determinamos que um membro pode ser sobrescrito em uma classe filha. Por sua vez, usando a palavra-chave override determinamos que na classe derivada, um membro virtual da classe base pode ser sobrescrito.

     

    Devemos ter em mente que ambas as palavras-chave completam uma à outra. Importante salientar também que a propagação da palavra-chave virtual ocorre para descendentes. Um método virtual pode ser sobrescrito em descendentes e, ainda, em uma classe derivada."

     

    http://programandodotnet.wordpress.com/2011/01/15/virtual-override-e-sealed/

    http://matheuscalache.blogspot.com/2009/07/java-e-c-abstract-virtual-e-override.html


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    quarta-feira, 21 de setembro de 2011 16:56
  • Quais sao os modificaroes k removes e nao gera erro?
     public class A
    
        {  public void exibe()
    
            {
    
                System.Console.WriteLine("A");
    
            }
    
        }
    
        public class B : A
    
        {   public void exibe() ----------------vai compilar mais gera erro;
    
            {
    
                System.Console.WriteLine("B");           
    
            }
    
        }
    
       public  class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                B bbb = new B();
    
                bbb.exibe();
    
    
    
                System.Console.ReadLine();
    
            }
    
        }
    
    

     


    One word frees us of all the weight and pain of life: that word is love.
    quarta-feira, 21 de setembro de 2011 17:21
  •   public void exibe() ----------------vai compilar mais gera erro;      

    ai que ta a chave da questão tecnicamente ele não gera erro apenas um warning!!!!

    a exibição e o produto e da operação não são afetados!!!! o resultado é o mesmo se eu colocar virtual, override se eu não colocar o compilador apenas gera um warning mas não impede que o resultado e o programa funcionem!!

    minha suspeita é que quando vc tem o metodo na classe pai metodox()

    se tiver o mesmo metodox() na classe filha se vc não definir como virutal e override o compilador faz uma sobreescrita implicita!!!

    mas não tenho certeza se é assim mesmo neste exemplo que eu dei funciona desta forma, mas de forma geral não sei qual a regra!!!

    quarta-feira, 21 de setembro de 2011 18:01
  • Amigo, realmente o Visual Studio não irá da error, mas também não irá funcionar na maneira que deveria. entenda que o virtual/override possiblitar a que métodos sejam sobrescritos por classes dérivadas. Da maneira que você fez deu certo por que você diretamente instânciou a classe B e chamou o método de B. 

    Mas, veja meu exemplo abaixo:

        public class Program
        {
            static void Main(string[] args)
            {
                ProgramaPrimario programa = new ProgramaPrimario();
                Console.WriteLine(programa.Carregar());
                Console.ReadLine();
                programa = new ProgramaCustomizado();
                Console.WriteLine(programa.Carregar());
                Console.ReadLine();
            }
        }
        public class ProgramaPrimario
        {
            protected string strLoad= string.Empty;
    
            public virtual void CargaInicial()
            {
                strLoad += " CargaInicial ";
            }
            public virtual void VerificaDrivers()
            {
                strLoad +=  " Verificou Drivers ";
            }
            public virtual void IniciaSistema()
            {
                strLoad +=  " Iniciou Sistema com Sucesso ";
            }
    
            public string Carregar()
            {
                this.CargaInicial();
                this.VerificaDrivers();
                this.IniciaSistema();
                
                return strLoad;
            }
        }
        public class ProgramaCustomizado : ProgramaPrimario
        {
            public override void CargaInicial()
            {
                base.strLoad += " Carga Inicial + verificação de Segurança ";
            }
        }
    

    veja que eu tenho uma classe ProgramaPrimario que nela tenho um método que não pode ser sobrescrito, o método Carregar. da maneira que eu programei, eu possibiltei a outras pessoas a pegarem a minha biblitoeca gerada e extenderem o código da minha aplicação para sua utilização customizando as etapas de inicialização de um sistema, porém...a sequência de inicialização ainda será a mesma(como é feito para controlar o ciclo de vidas dos web forms e windows forms) se você executar verá que os carregar foram diferentes, porém se você tirar o override do programaCustomizado, verá que o CargaInicial chamado será o do ProgramaInicial e não o do programaCustomizado. Pois este método deixou de ser uma extensão da minha classe.


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 22 de setembro de 2011 11:40
    Moderador
  • ate entendi o que foi feito, porem vc misturou a questao dos metodos virtual e override com polimorfismo.. o que gera uma certa confusão pq estou tentando entender os 2 assim de forma clara!!! mas nos exemplos que tenho encontrado ambos andam lado a lado existe uma forma de sobrescrever um metodo virutal sem polimorfismo isso faz sentido??? teria um exemplo?
    quarta-feira, 28 de setembro de 2011 11:53
  • Amigo, métodos virtuais, sobrescrição dos mesmos e Polimorfismo são caractéristicas da Orientação a Objeto. A virtualização de métodos é uma das caracteristicas que torna o polimorfismo algo tão poderoso, por isso eles sempre andarão juntos. 

    Apartir do momento que você está usando herança, se bem definido, eu não vejo o por que de sobrescrever um método virtual sem que ele seja o da classe pai e ainda assim herdando ele. Se for para ser diferente, não herde da classe pai, ou, implemente uam interface com o que lhe interessa em ter de métodos a serem construidos pelas classes que a implementam.

     


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Paulo César Viana quarta-feira, 28 de setembro de 2011 13:36
    • Marcado como Resposta Filipibh quarta-feira, 28 de setembro de 2011 17:14
    quarta-feira, 28 de setembro de 2011 13:14
    Moderador