Neu in .NET 7 [9]: Überladen von Operatoren in Schnittstellen ab C# 11.0

Die jüngste C#-Version ermöglicht das Überladen von Operatoren nicht nur in Klassen, sondern auch in Interfaces.

Lesezeit: 1 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen

(Bild: Piyawat Nandeenopparit/Shutterstock.com)

Von
  • Dr. Holger Schwichtenberg

Seit der ersten Version von C# ermöglicht die Programmiersprache das Überladen von Operatoren. C# 11.0 führt die Möglichkeit ein, eine Operatorüberladung in einem Interface zu definieren, um eine Vorgabe beziehungsweise Gemeinsamkeit für alle Implementierungen zu schaffen. Erst seit C# 11.0 ist static abstract in Schnittstellen erlaubt.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist Chief Technology Expert bei MAXIMAGO, die Innovations- und Experience-getriebener Softwareentwicklung, u.a. in hochkritischen sicherheitstechnischen Bereichen, anbietet. Zudem ist er Leiter des Expertennetzwerks www.IT-Visions.de, das mit 38 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratung und Schulung bei der Entwicklung sowie dem Betrieb von Software unterstützt.

Ein Interface mit einem überladenen Operator könnte folgendermaßen aussehen:

namespace de.WWWings;
 
public interface IFlug<TSelf> 
  where TSelf : IFlug<TSelf>
{
 string AbflugOrt { get; set; }
 double Auslastung { get; }
 DateTime Datum { get; set; }
 long FlugNr { get; set; }
 short FreiePlaetze { get; set; }
 bool Nichtraucherflug { get; set; }
 short Plaetze { get; set; }
 string Route { get; }
 string ZielOrt { get; set; }
 
 public static abstract Flug operator 
  +(TSelf flug, de.WWWings.PassagierSystem.Passagier pass);
}

Der eine oder die andere wird sich fragen, warum die Schnittstelle generisch sein muss. Der Grund dafür ist einfach: Man will am Ende ein Flug-Objekt einfach mit + zu einem Passagier addieren können. Ohne die generische Implementierung könnte man nur eine Variable vom Typ IFlug zum Passagier addieren.

Schließlich benötigt die Implementierung der Klasse noch die Schnittstellenimplementierung : IFlug<Flug>:

namespace de.WWWings
{
 
 public partial class Flug : IFlug<Flug>
 {
  …
 
  /// <summary>
  /// Operatorüberladung fuer die Buchung eines Flugs 
  /// durch Addition eines Flug- und eines Passagier-Objekts.
  /// </summary>
  /// <param name="flug">Flugobjekt</param>
  /// <param name="pass">Passagierobjekt</param>
  /// <returns>Flugobjekt mit hinzugefügten Passagier</returns>
  public static Flug operator +(Flug flug,
                                PassagierSystem.Passagier pass)
  {
   pass.Buchen(flug);
   return flug;
  }
 
 }
}

(rme)