C# Rückgabetyp Kovarianz: Einschränkungen und Lösungen
.NET -Website -Entwicklung erfordert häufig maßgeschneiderte Seitentypen. Der Zugriff auf diese Seiten von Steuerelementen kann problematisch sein, es sei denn, der Standard -Seiten -Typ wird mit einem benutzerdefinierten überschrieben. C# unterstützt jedoch keine direkte Kovarianztyp -Kovarianz, wodurch eine einfache Überschreibung einer Basisklassenmethode verhindern wird, um einen spezielleren Typ zurückzugeben. Diese Einschränkung erfordert eine Problemumgehung.
Die Herausforderung: Überschreiben Sie eine Basisklassenmethode direkt, um einen abgeleiteten Typ zurückzugeben, in C#ist nicht zulässig.
Workaround -Strategie:
Die Lösung beinhaltet die Verwendung einer abstrakten Basisklassenmethode und einer konkreten Klassenmethode, die einen new
-Modifikator nutzt, um einen ähnlichen Effekt zu erzielen. Dieser Ansatz behält eine stärkere Tippen beim Umgang mit Kompilierungs-Zeit-Typen bei.
Beispielimplementierung:
<code class="language-csharp">abstract class Enclosure { protected abstract Animal GetContents(); public Animal Contents() { return this.GetContents(); } } class Aquarium : Enclosure { protected override Animal GetContents() { return this.Contents(); } public new Fish Contents() { /* ... implementation to return a Fish object ... */ } }</code>
Dieses Muster ermöglicht das Überschreiben der virtuellen GetContents()
-Methode, während ein spezifischerer Rückgabetyp (Fish
) durch die Contents()
-Methode in der abgeleiteten Klasse (Aquarium
) überschritten wird. Das Schlüsselwort new
zeigt ausdrücklich an, dass die abgeleitete Klasse eine neue Methode erstellt und die Basisklassenmethode nicht überschreibt. Dies erreicht effektiv das gewünschte Verhalten, während sie sich an die Typ -Systembeschränkungen von C#halten.
Das obige ist der detaillierte Inhalt vonKann C# eine Kovarianztyp -Rückgabetyp erreichen, und wenn nicht, welche Problemumgehungen existieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!