segunda-feira, 20 de outubro de 2008

override >> C#

Para quem nao sabe, eu estou no curso de Engenharia Informática na Universidade da Madeira, pelo que a minha area principal de conhecimento é a informática (software principalmente). Interesso-me por muito mais que informatica, mas nao deixa de ser a minha vocacao.

Primeiro... o que é override?
o override é usado na programacao orientada a objectos que permite 'as subclasses a implementacao de um método que já está implementado na sua superclasse. A implementacao na subclasse substitui a implementacao na superclasse.

Pois bem, neste post vou falar sobre override no C#, devo dizer-vos que a minha experiencia de programacao nesta linguagem é quase nula. Estou muito mais familiarizado com Java. Mas estou a gostar de trabalhar com C#.

O método reescrito por uma declaracao de override é conhecido como método base. O método base tem que ter a mesma assinatura que o método do override.

Nao é possivel fazer override a um método nao virtual ou estático (static). O método base tem que ser virtual, abstract ou override.

A partir da subclasse, ainda é possivel aceder ao método com override usando a palavra chave "base". Por exemplo, se tens um metodo virtual MeuMetodo(), e um método com override numa subclasse, podes aceder o método virtual a partir da subclasse usando a chamada:
base.MeuMetodo()
Exemplo:
Neste exemplo, existe uma classe base, Quadrado, e uma classe derivada, Cubo (uma superclasse e uma sublasse). Porque a area do cubo é a soma da area de seis quadrados, é possivel calcular a area chamando o metodo Area() na classe base.

using System;
class ClasseTeste
{
   public class Quadrado 
   {
      public double x;
      // Constructor:
      public Quadrado(double x) 
      {
         this.x = x;
      }

      public virtual double Area() // verifiquem o uso de "virtual"
      {
         return x*x; 
      }
   }
   class Cubo: Quadrado // para quem programa em Java provavelmente notou 
   {                    // que em C# usa-se ":" em vez de "extends"...
      // Constructor:
      public Cubo(double x): base(x)    // e base() em vez de super()
      {
      }
      // Chamando o método base Area (verifiquem o uso de "override"):
      public override double Area() 
      {                            // verifiquem o uso de base.Area()
         return (6*(base.Area())); // muito interessante...
      }
   }
   public static void Main()
   {
      double x = 5.2;
      Quadrado s = new Quadrado(x);
      Quadrado c = new Cubo(x);
      Console.WriteLine("Area do Quadrado = ", s.Area());
      Console.WriteLine("Area do Cubo = ", c.Area());
   }
}
A saida do código em cima seria:
Area do do Quadrado = 27.04
Area do Cubo = 162.24

É tudo. Usei recentemente algo deste género num trabalho da universidade, achei interessante falar disto aqui. (para o pessoal da minha área, os outros saltem por cima) ;)