C# aufrufen interface-Methoden innerhalb der Klasse
interface ILol
{
void LOL();
}
class Rofl : ILol
{
void ILol.LOL()
{
GlobalLOLHandler.RaiseROFLCOPTER(this);
}
public Rofl()
{
//Is there shorter way of writing this or i is there "other" problem with implementation??
(this as ILol).LOL();
}
}
Versuchen Sie zu vermeiden zu nennen, "virtual" - Funktionen von einem Konstruktor! Sie können am Ende ruft eine Implementierung, die auf eine nicht vollständig konstruierten Objekt.
InformationsquelleAutor 0xDEAD BEEF | 2010-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie implementiert die Schnittstelle explizit, die, im Allgemeinen, brauchen Sie nicht zu tun. Stattdessen implementieren Sie implizit und nennen Sie es wie Sie würde jede andere Methode:
(Hinweis: Ihre Implementierung muss auch öffentlich sein.)
Guter Herr, das ist peinlich. Behoben - danke!!!!
Was ist der Unterschied zwischen impliziten und expliziten Umsetzung? Wenn ich nicht hinzufügen ILol. bevor LOL, dann compiler beschwert sich, dass es keine Umsetzung der ILol.LOL.
Explizite Schnittstellen kann nur aufgerufen werden, wenn das Objekt geworfen wird, um die Schnittstelle geben. Es gibt verschiedene obskure Vorteile dieser, aber ansonsten sollten Sie es vermeiden. Wie, warum dein code nicht funktioniert kann ich nur vermuten: sind die Methoden, die die Implementierung Ihrer Schnittstelle öffentlich zugänglich?
Zu klären: was ladenedge sagt in dem Kommentar direkt über, ist, dass die OP nötig hinzufügen
public
vor seiner Erklärung, wenn er nahmILol.
.InformationsquelleAutor ladenedge
Möchten Sie vielleicht ändern Sie die Besetzung von
(this as ILol)
zu((ILol)this)
. Ein as-cast ist zulässig, wenn null zurückgegeben, es kann zu verwirrenden Fehler später und das hat der compiler zu testen.as
gegossen, im Vergleich zu den nicht-as
?Über das zurückgegebene Objekt aus
as
vor der überprüfung auf null, ist eine schlechte Praxis. Der obige code nicht aufweisen, alle Probleme so geschrieben hat, aber nicht mehr als stabil, während der Umgestaltung.Die wie gegossen null zurückgeben kann, so muss der compiler auf null zu testen, vor dem Aufruf der Methode, so dass es erzeugen kann, die die null-Referenz-Ausnahme. eine regelmäßige Besetzung kann nicht immer null zurück, so kann der compiler zu umgehen, aber für den test auf null.
Die obige Diskussion verwirren könnte jemand, der vor kurzem gelernt, zu verwenden
as
werden, so können Sie mit Situationen umgehen, in denen ein Objekt kann nicht in den Zieltyp umgewandelt. Die Regel ist: wenn Sie nicht 100% sicher, dass der cast wird immer gültig sein, verwenden Sieas
ist, dann test, ob das Ergebnisnull
. Wenn es nicht möglicherweise nicht [hier wissen wirthis
ist einILol
, weil es definiert ist], dann tun die direkte Besetzung,(ILol)
.InformationsquelleAutor Stewart
Nicht verwenden
as
nur cast:InformationsquelleAutor Mark Byers
Nein, nicht, wenn Sie explizit der Implementierung der Schnittstelle. Wenn Sie es implizit, indem Sie entfernen den Namen der Schnittstelle aus der implementierten Methode es werden arbeiten, wie Sie wollen.
InformationsquelleAutor Isak Savo
Brauchen Sie nicht zu wirken überhaupt. Da
ROFL
implementiertILOL
rufen Sie einfach anthis.LOL()
oder auch nurLOL();
ILOL
und kann nicht aufILOL
Mitglieder ohne Zugriff auf eine Instanz (this
gegossen)ILOL
.InformationsquelleAutor cortijon