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.

In Pocket speichern vorlesen Druckansicht

(Bild: Piyawat Nandeenopparit/Shutterstock.com)

Lesezeit: 1 Min.
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 technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

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)