Neu in .NET 7 [8]: Statische abstrakte Properties & Methoden in Interfaces in C#
In der neuen Version von Microsofts Programmiersprache C# dürfen Schnittstellendeklarationen von Properties und Methoden als static abstract deklariert sein.
- Dr. Holger Schwichtenberg
C# 11.0 erlaubt Schnittstellendeklarationen von Properties und Methoden mit static abstract
und static virtual
. In C# 10.0 war das schon experimentell möglich.
Beispiel: Es gibt zwei Schnittstellen. IObjectWithID
gibt eine statische Property vom Typ Integer mit Namen ID
vor. Die darauf aufbauende Schnittstelle IAbc
gibt drei weitere Mitglieder vor:
- Eine formale abstrakte Instanzmethode
GetA()
, - eine statische Methode
GetB()
mit Implementierung und - eine statische abstrakte Methode
GetC()
:
interface IObjectWithID
{
static abstract int ID { get; set; } // NEU
}
interface IAbc : IObjectWithID
{
string GetA();
static string GetB() => "B";
static abstract string GetC(); // NEU
}
Dazu zeigt folgende Implementierung der Klasse Abc
auf Basis von Schnittstelle IAbc
, dass man die als static abstract
deklarierten Mitglieder nun als statische Mitglieder implementieren muss:
class Abc : IAbc
{
public string GetA() => "A";
// muss nicht-statische Implementierung für GetA() liefern
public static string GetC() => "C";
// muss statische Implementierung für GetC() liefern
public static int ID { get; set; } = 1;
// muss statische Implementierung für ID liefern
}
Dann sind folgende Verwendungen möglich:
var obj = new Abc();
// Instanzmitglied:
Console.WriteLine(obj.GetA());
// statisches Mitglied direkt im Interface:
Console.WriteLine(IAbc.GetB());
// statisches Mitglied - Nutzung via Klassenname:
Console.WriteLine(Abc.ID);
// statisches Mitglied - Nutzung via Klassenname:
Console.WriteLine(Abc.GetC());
An diesem Sprachfeature hat Microsoft laut Aussage von Program Manager Mads Torgersen mehr als zehn Jahre gearbeitet. Erst die Möglichkeit, die Runtime von .NET zu verändern, hat die Umsetzung zur Produktreife gebracht (Quelle: .NET Conf 2022, 9.11.2022). Veränderungen der Runtime wurden im klassischen .NET Framework wegen möglicher Breaking Changes nicht oder nur in kleinen Dosen umgesetzt.
(rme)