Fundamentos de la POO con C# [7/10]: Clases estáticas y abstractas
Aprendiendo a emplear este tipo de clases "especiales" te ayudará a ser un programador con buena base técnica, sin duda 😉

Contenido de la Serie de artículos

Estos son todos los temas de la serie:

  1. 1. La Programacion orientada a objetos (POO) y el diseño orientado a objetos (DOO)
  2. 2. Los requerimientos: funcionales y no funcionales
  3. 3. Objetos y clases
  4. 4. Tipos de datos en C#: Por valor y por referencia
  5. 5. Constructores
  6. 6. Signaturas e Interfaces
  7. 7. Clases especiales: estáticas y abstractas
  8. 8. Modificadores de acceso
  9. 9. Los 4 Pilares de la POO: Herencia, abstracción, encapsulamiento y polimorfismo
  10. 10. Los Principios SOLID
Toma nota crack y aplícalo en tus proyectos. Foto de LinkedIn Sales Solutions en Unsplash

Ya hemos aprendido lo que es una clase, sin embargo, existen clases "especiales" por así decirlo, es el caso de las clases estáticas y abstractas, veamos una por una y nos quedará muy claro este asunto 😉

Clase estática

Las clases normales, por así decirlo, tienen miembros (campos, propiedades y métodos) los cuales son utilizados cuando nosotros instanciamos un objeto de esa clase, entonces, esto quiere decir que la razón de ser de una clase, es poder trabajar con ella y sus miembros.

Esto es posible gracias al encapsulamiento, mediante el cual un objeto, es decir, la instancia de una clase, tiene miembros relacionados a dicho objeto. Si creo otra instancia, ésta tendrá su propio objeto con miembros distintos a los de la primera instancia.

En el caso de las clases estáticas, éstas tienen un comportamiento diferente, porque no pueden ser instanciadas, es decir la podemos utilizar sin necesidad de crear un objeto de ella. Por lo tanto, no tiene miembros asociados a una instancia en particular.

Toda clase estática debe tener miembros estáticos, esto quiere decir que una clase estática debe tener campos, propiedades y métodos declarados como estáticos, esto incluye a su constructor.

Recordemos estas características de las clases estáticas:

  • No pueden implementar interfaces
  • No pueden heredar ni ser heredadas

En síntesis, las clases estáticas se utilizan para organizar funcionalidades o métodos los cuales no están asociados a objetos particulares.

Entonces te preguntarás, para qué se utilizan?

Para métodos generales, o utilitarios que queramos utilizar desde cualquier parte de nuestra aplicación.

Seamos pragmáticos, aquí te dejo algunos ejemplos reales de qué funcionalidades podemos declarar en una clase estática:

  • Hashear una cadena de texto
  • Calcular cantidad de dias entre dos fechas
  • Enviar un email
  • Convertir magnitudes, por ejemplo: pasar de grados celsius a fahrenheit.

Aquí te dejo como ejemplo una clase estática la cual define un método, estático también.

Nota cómo en C# para declarar una clase como estática, así como sus miembros usamos la palabra reservada static.

    public static class HashHelper
    {
        public static string MD5(string word)
        {
            MD5 md5 = MD5CryptoServiceProvider.Create();
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] stream = null;
            StringBuilder sb = new StringBuilder();
            stream = md5.ComputeHash(encoding.GetBytes(word));
            for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
            return sb.ToString();
        }
    }

En este caso, la funcionalidad la definí como estática porque se trata de aplicar el algoritmo criptográfico MD5 a una cadena de texto, la cual me devuelve un string con el hash.

Esta funcionalidad no depende de objeto alguno y eventualmente llamaré a esta funcionalidad desde distintas partes de mi software, así que cumple con los requisitos.

Si quieres información de este tema adicional, te recomiendo esta entrada de blog del buen Felipe Gavilán.

Clases abstractas

Ahora hablemos sobre este tipo de clases, son aquellas que se utilizan como clases base para otras clases.

Este tipo de clases tampoco se pueden instanciar.

Las clases abstractas pueden tener métodos con una definición por defecto, pero si queremos que su clase hija la modifique debemos hacer uso de la palabra reservada virtual.

Las clases que implementan una clase abstracta, es decir las clases hijas, no están obligadas a implementar los métodos que ésta define.

Veamos todo esto con un ejemplo:

  • Definiremos la clase base Polígono y la clase Cuadrado que la implementa
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Clases abstractas!");
            var cuadrado = new Cuadrado(10);
            Console.WriteLine($"El lado es {cuadrado.Lado}, el área es {cuadrado.CalcularArea()}, el perimetro es {cuadrado.CalcularPerimetro()} y el valor es {cuadrado.metodoEjemplo()}");
        }
    }
    public abstract class Poligono
    {
        public abstract double CalcularArea();
        public abstract double CalcularPerimetro();
        public virtual bool metodoEjemplo()
        {
            return true;
        }
    }

    public class Cuadrado : Poligono
    {
        //Propiedad
        public int Lado { get; }
        //Constructor
        public Cuadrado(int lado)
        {
            Lado = lado;
        }
        //Métodos
        public override double CalcularArea()
        {
            return Math.Pow(this.Lado, 2);
        }
        public override double CalcularPerimetro()
        {
            return this.Lado * 4;
        }
        public override bool metodoEjemplo()
        {
            return false; //sobreescribimos la funcionalidad de la clase base
        }
    }

Si corremos el ejemplo tenemos:

En qué se diferencian una clase abstracta de una interfaz?

  • Una clase sólo se puede heredar o implementar una clase base, mientras que puede implementar múltiples interfaces.
  • En una clase abstracta podemos definir modificadores de acceso, en las interfaces no.
  • La clase abstracta puede tener constructor, la interfaz no.

Más info puedes encontrarla en este buen blog también 😉

Eso es todo por ahora estimados devs! Nos vemos en el siguiente artículo de esta espectacular serie 😉

Si esta entrada te ha gustado, compártela 😊

Deja una respuesta

Tu dirección de correo electrónico no será publicada.