Interfaz vs clases abstractas en C#

Bilal Shahid 15 febrero 2024
Interfaz vs clases abstractas en C#

Las clases tienen diferentes especificadores en C#. Hoy estaremos hablando de dos clases; Clases de interfaz y abstractas.

Diferencia entre clases abstractas y de interfaz en C#

Una interfaz es algo que define cómo debe funcionar algo. Es necesario proporcionar una guía o una configuración básica sobre cosas y comunicarse entre objetos.

Una interfaz solo implementa métodos o indica qué funciones se deben realizar o se requieren. Solo proporcionará la configuración básica; el resto está en la clase que lo hereda para implementar y ampliar estas funciones según sea necesario.

Entonces, si tuviéramos una clase COCHE y una clase BICICLETA, podrían heredar la interfaz VEHÍCULO que podría contener funciones comunes a ambas clases (COCHE y BICICLETA) como; get_engine_vid(), set_color() etc. El VEHÍCULO aquí actuaría como una interfaz.

Verá cómo una interfaz ayuda a mantener un protocolo de definición estándar dentro de las clases. Todos los métodos declarados dentro de la interfaz son y deben ser extendidos.

Código de ejemplo:

interface VEHICLE {
  int get_engine();
  void set_engine_id();
}

class BIKE : VEHICLE {
  private : int engine_id;
  BIKE() {}
}

class CAR : VEHICLE {
  private : int engine_id;
  CAR() {}
}

Este código mostrará un error.

error de codigo

Para solucionarlo, implementaremos métodos en cada clase heredada en el siguiente código.

Código fijo:

interface VEHICLE {
  public int get_engine();
  public void set_engine_id(int id);
}

class BIKE : VEHICLE {
  private int engine_id;
  BIKE() {}
  public

      int get_engine() {
    return engine_id;
  }

  public void set_engine_id(int id) {
    engine_id = id;
  }
}

class CAR : VEHICLE {
  private int engine_id;
  CAR() {}

  public

      int get_engine() {
    return engine_id;
  }

  public void set_engine_id(int id) {
    engine_id = id;
  }
}

Ahora que tiene claras las interfaces, veamos las clases abstractas en C#.

Código de ejemplo:

abstract class VEHICLE {
  public abstract int get_engine();
  public abstract void set_engine_id(int id);
}

class BIKE : VEHICLE {
  private int engine_id;
  public BIKE() {}
  public

      override int get_engine() {
    return engine_id;
  }

  public override void set_engine_id(int id) {
    engine_id = id;
  }
}

class CAR : VEHICLE {
  private int engine_id;
  public CAR() {}

  public

      override int get_engine() {
    return engine_id;
  }

  public override void set_engine_id(int id) {
    engine_id = id;
  }
}

static void Main() {
  CAR n = new CAR();
  n.set_engine_id(2);
  Console.WriteLine("The engine id is: " + n.get_engine());
}

Puede ver cómo override tiende a establecerse aquí para extender las funciones declaradas en la clase abstracta. Entonces cuál es la diferencia?

Las clases abstractas se usan para varias clases con la misma estructura base, pero una interfaz solo se puede usar para definir un método que se puede implementar. No es necesario usarlo para múltiples clases que pueden o no heredar dicha estructura.

Las clases abstractas también pueden definir implementaciones predeterminadas de métodos. Sin embargo, este no es el caso de las interfaces.

Debe eliminar override para que funcione perfectamente.

Código fijo:

abstract class VEHICLE {
  public int get_engine() {
    Console.Write("I am here");
    return -1;
  }
  public abstract void set_engine_id(int id);
}

// and then in the classes:
// code c#
class BIKE : VEHICLE {
  private int engine_id;
  public BIKE() {}
  public

      int get_engine() {
    return engine_id;
  }

  public override void set_engine_id(int id) {
    engine_id = id;
  }
}

class CAR : VEHICLE {
  private int engine_id;
  public CAR() {}

  public

      int get_engine() {
    return engine_id;
  }

  public override void set_engine_id(int id) {
    engine_id = id;
  }
}

Eso es todo para las clases e interfaces abstractas. Esperamos que comprenda las diferencias y pueda usarlo de manera eficiente como lo desee.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - Csharp Class