Verwenden von Schnittstellen für abstrakte Klassen in C #
Lerne ich C# aus C++ und haben in eine Wand laufen.
Ich habe eine abstrakte Klasse AbstractWidget, eine Schnittstelle IDoesCoolThings, und eine Klasse die sich von AbstractWidget genannt RealWidget:
public interface IDoesCoolThings
{
void DoCool();
}
public abstract class AbstractWidget : IDoesCoolThings
{
void IDoesCoolThings.DoCool()
{
Console.Write("I did something cool.");
}
}
public class RealWidget : AbstractWidget
{
}
Wenn ich die Instanzierung eines RealWidget-Objekt, und rufen DoCool() auf, der compiler gibt mir die Fehlermeldung
'RealWidget' nicht enthalten
definition für "DoCool'
Kann ich cast RealWidget Objekt zu einem IDoesCoolThings und dann der Aufruf funktioniert, aber das scheint unnötig und ich auch verlieren Polymorphismus (AbstractWidget.DoCool() wird immer aufgerufen, auch wenn ich definieren RealWidget.DoCool()).
Ich mir vorstellen, dass die Lösung einfach ist, aber ich habe versucht eine Vielzahl von Dingen und für das Leben von mir kann nicht herausfinden this one out.
InformationsquelleAutor der Frage JubJub | 2009-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Läufst du in das Problem, weil Sie verwendet explizite interface-Implementierung (EII). Wenn ein Mitglied explizit implementiert, es kann nicht zugegriffen werden durch eine Instanz der Klasse -- nur durch eine Instanz der Schnittstelle. In Ihrem Beispiel, das ist, warum Sie nicht nennen
DoCool()
es sei denn, Sie werfen Sie Ihre Instanz zuIDoesCoolThings
.Die Lösung ist, um
DoCool()
öffentlichen und entfernen Sie die explizite interface-Implementierung:Im Allgemeinen verwenden Sie ELL in zwei Fällen:
InformationsquelleAutor der Antwort John Feminella
Ändern Sie Ihre Erklärung an:
InformationsquelleAutor der Antwort Mitch Wheat
Die Art und Weise Sie implementiert die Schnittstelle explizit implementieren void IDoesCoolThings.DoCool(), wenn Sie die implizite Schnittstelle implementieren.
Dann wird es funktionieren.
Lesen :
C# - Interfaces. Implizite Umsetzung versus Explizite Implementierung
InformationsquelleAutor der Antwort J.W.
Sollte man es so machen:
Verwendung:
InformationsquelleAutor der Antwort Toffee