Schnittstelle vs. abstrakte Klassen in C#

Bilal Shahid 15 Februar 2024
Schnittstelle vs. abstrakte Klassen in C#

Klassen haben unterschiedliche Bezeichner in C#. Heute werden wir über zwei Klassen sprechen; Interface- und Abstract-Klassen.

Unterschied zwischen Abstract- und Interface-Klassen in C#

Eine Schnittstelle ist etwas, das definiert, wie etwas funktionieren soll. Es ist erforderlich, eine Richtlinie oder eine grundlegende Einrichtung für Dinge bereitzustellen und zwischen Objekten zu kommunizieren.

Eine Schnittstelle implementiert nur Methoden oder teilt mit, welche Funktionen ausgeführt werden sollen oder erforderlich sind. Es wird nur die grundlegende Einrichtung bereitgestellt; der Rest liegt bei der Klasse, die sie erbt, um diese Funktionen nach Bedarf zu implementieren und zu erweitern.

Wenn wir also eine CAR-Klasse und eine BIKE-Klasse hätten, könnten sie die Schnittstelle VEHICLE erben, die gemeinsame Funktionen für diese beiden Klassen (CAR and BIKE) enthalten könnte, wie z. get_engine_vid(), set_color() usw. Das VEHICLE würde hier als Schnittstelle fungieren.

Sie sehen, wie eine Schnittstelle dabei hilft, ein Standarddefinitionsprotokoll innerhalb von Klassen aufrechtzuerhalten. Alle innerhalb der Schnittstelle deklarierten Methoden sind und sollten erweitert werden.

Beispielcode:

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() {}
}

Dieser Code zeigt einen Fehler an.

Codefehler

Um dies zu beheben, implementieren wir Methoden in jeder geerbten Klasse im folgenden Code.

Fester Code:

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;
  }
}

Nachdem Sie sich nun mit Schnittstellen vertraut gemacht haben, wollen wir uns abstrakte Klassen in C# ansehen.

Beispielcode:

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());
}

Sie können sehen, wie hier tendenziell override gesetzt wird, um die in der abstrakten Klasse deklarierten Funktionen zu erweitern. Was ist also der Unterschied?

Abstrakte Klassen werden für mehrere Klassen mit derselben Basisstruktur verwendet, aber eine Schnittstelle kann nur verwendet werden, um eine Methode zu definieren, die implementiert werden kann. Die Verwendung für mehrere Klassen, die eine solche Struktur erben können oder nicht, ist unnötig.

Abstrakte Klassen können auch Standardimplementierungen von Methoden definieren. Bei Schnittstellen ist dies jedoch nicht der Fall.

Sie müssen override entfernen, damit es perfekt funktioniert.

Fester Code:

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;
  }
}

Das war es für abstrakte Klassen und Interfaces. Wir hoffen, dass Sie die Unterschiede verstehen und es nach Ihren Wünschen effizient nutzen können.

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

Verwandter Artikel - Csharp Class