Warum nicht C# Statische Methoden zu Implementieren, die eine Schnittstelle?
Warum wurde C# entwickelt auf diese Weise?
Als ich verstehen es, eine Schnittstelle beschreibt nur das Verhalten, und dient dem Zweck der Beschreibung einer vertraglichen Verpflichtung für die Klassen implementieren die Schnittstelle, die bestimmte Verhaltensweisen umgesetzt wird.
Wenn Klassen umsetzen wollen, das Verhalten in eine gemeinsame Methode, warum sollte Sie nicht?
Hier ist ein Beispiel, was ich im Sinn haben:
//These items will be displayed in a list on the screen.
public interface IListItem {
string ScreenName();
...
}
public class Animal: IListItem {
//All animals will be called "Animal".
public static string ScreenName() {
return "Animal";
}
....
}
public class Person: IListItem {
private string name;
//All persons will be called by their individual names.
public string ScreenName() {
return name;
}
....
}
InformationsquelleAutor der Frage Kramii | 2008-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, Sie Fragen, warum Sie dies nicht tun:
Macht das keinen Sinn für mich, semantisch. Angegebenen Methoden über eine Schnittstelle sollte es angeben, der Vertrag für die Interaktion mit einem Objekt. Statische Methoden nicht ermöglichen Ihnen die Interaktion mit einem Objekt - wenn Sie finden, sich selbst in die position, wo Sie Ihre Umsetzung gemacht werden konnten, statische, müssen Sie möglicherweise Fragen Sie sich, ob diese Methode gehört wirklich in die Schnittstelle.
Zur Implementierung der Beispiel, die ich geben würde Tier ein const-Eigenschaft, die würde immer noch erlauben, es für den Zugriff von einem statischen Kontext, und zurück, dass Wert in der Umsetzung.
Für eine komplizierte situation, man konnte immer erklären, eine weitere statische Methode und delegieren. In versuchen mit einem Beispiel, ich konnte nicht aus irgendeinem Grund denken, Sie würden etwas tun, nicht-triviale sowohl eine statische und Instanz-Kontext, so dass ich erspare Euch ein FooBar-blob, und nehmen Sie es als Indiz, dass es vielleicht nicht eine gute Idee sein.
InformationsquelleAutor der Antwort Chris Marasti-Georg
Meiner (vereinfachten) technischen Grund dafür ist, dass statische Methoden sind nicht in der vtableund die call site gewählt wird, wird zur compile-Zeit. Es ist der gleiche Grund können Sie nicht überschreiben oder virtuelle statische Mitglieder. Für mehr details, Sie müssten eine CS grad oder compiler-wonk - die ich bin weder.
Für die politische Vernunft, ich werde Zitat Eric Lippert (wer ist ein compiler wonk, und hält einen Bachelor der Mathematik, der informatik und der Angewandten Mathematik von der University of Waterloo (Quelle: LinkedIn):
Beachten Sie, dass Lippert lässt Raum für eine so genannte Typ-Methode:
aber ist noch nicht überzeugt von deren Nützlichkeit.
InformationsquelleAutor der Antwort Mark Brackett
Meisten Antworten hier scheinen verpassen den Punkt. Polymorphismus kann verwendet werden, nicht nur zwischen den Instanzen, sondern auch zwischen den Arten. Dies ist oft nötig, wenn wir Generika.
Nehmen wir an, wir haben type-parameter im generischen Methode und wir müssen einige Arbeit mit Ihr. Wir wollen instantinate, weil wir uns nicht bewusst sind die Konstruktoren.
Beispiel:
Leider, ich kann kommen, nur mit "hässlich" alternativen:
Reflektion verwenden
Hässlich und beats die Idee der Schnittstellen und Polymorphie.
Ganz eigenes Werk, Klasse
Dies kann erheblich erhöhen die Komplexität des Codes. Zum Beispiel, wenn wir versuchen zu modellieren, domain-Objekte, jedes Objekt müsste ein anderes repository-Klasse.
Instanziieren und rufen Sie dann die gewünschte interface-Methode
Kann dies schwer zu realisieren, auch wenn wir die Quelle für die Klassen als generische Parameter. Der Grund ist, dass, zum Beispiel, vielleicht brauchen wir die Instanzen werden nur in den bekannten, "connected to DB" Stand.
Beispiel:
um instantination für die Lösung der statischen interface-problem, wir müssen die folgenden tun:
Dies ist natürlich unschön und auch unnötig erschwert der code für alle anderen Methoden. Offensichtlich, nicht eine elegante Lösung!
InformationsquelleAutor der Antwort Ivan Arjentinski
Ich weiß, es ist eine alte Frage, aber es ist interessant. Das Beispiel ist nicht das beste. Ich denke, es wäre viel klarer, wenn Sie zeigte eine Fallstudie-Verwendung:
Lediglich in der Lage, statische Methoden implementieren ein interface würde nicht erreichen, was Sie wollen; was erforderlich wäre, wäre, wenn statische Elemente als Teil ein interface. Ich kann mir durchaus vorstellen viele Einsatzszenarien, vor allem wenn es darum geht, in der Lage, Dinge zu kreieren. Zwei Ansätze, die ich bieten konnte, die hilfreich sein könnten:
Keiner dieser Ansätze wirklich Ansprechend. Auf der anderen Seite, würde ich erwarten, dass, wenn die Mechanismen existierten in CLR, um diese Art von Funktionalität sauber .net ermöglichen würde, um anzugeben, parametrisierte "neue" Zwänge (da wissen, ob eine Klasse einen Konstruktor mit einer bestimmten Signatur zu sein scheint, vergleichbar mit der Schwierigkeit, zu wissen, ob es eine statische Methode mit einer bestimmten Signatur).
InformationsquelleAutor der Antwort supercat
Schnittstellen geben das Verhalten eines Objekts.
Statische Methoden, die nicht angeben ein Verhalten eines Objektes, sondern das Verhalten, das wirkt sich ein Objekt auf eine bestimmte Weise.
InformationsquelleAutor der Antwort John Kraft
Kurzsichtigkeit, Schätze ich.
Als ursprünglich ausgelegt, die Schnittstellen waren nur dazu bestimmt, verwendet werden, die mit Instanzen der Klasse
Es wurde erst mit der Einführung von Schnittstellen-Einschränkungen für Generika hat das hinzufügen einer static-Methode eine Schnittstelle haben den praktischen nutzen.
(Antwort zu Kommentar:) ich glaube, es zu ändern jetzt würde erfordern eine änderung der CLR, die würde führen zu Inkompatibilitäten mit vorhandenen Baugruppen.
InformationsquelleAutor der Antwort James Curran
Soweit, die Schnittstellen darstellen, "Verträge", es scheint ruhig zumutbar statische Klassen, die Schnittstellen implementieren.
Die oben genannten Argumente scheinen alle zu verpassen, an diesem Punkt über Verträge.
InformationsquelleAutor der Antwort George
Weil der Zweck einer Schnittstelle ist es, Polymorphismus, in der Lage, übergeben Sie eine Instanz einer beliebigen Anzahl von Klassen festgelegt, die definiert wurden zur Umsetzung der definierten Schnittstelle... gewährleisten, dass innerhalb Ihres polymorphen aufrufen, wird der code in der Lage sein zu finden die Methode, die Sie aufrufen. es macht keinen Sinn zu ermöglichen, eine statische Methode zu implementieren die Schnittstelle,
Wie würden Sie es nennen??
InformationsquelleAutor der Antwort Charles Bretana
Bezug auf statische Methoden verwendet, die in nicht-generischen Kontexten ich bin damit einverstanden, es macht nicht viel Sinn, es Ihnen zu ermöglichen, in den Schnittstellen, da Sie nicht in der Lage sein, Sie zu nennen, wenn Sie hatte einen Verweis auf die Schnittstelle sowieso. Es gibt jedoch einen grundlegenden Loch in die design-Sprache erstellt, mit Hilfe von Schnittstellen, die NICHT in einem polymorphen Kontext, sondern im Allgemeinen. In diesem Fall wird die Schnittstelle ist keine Schnittstelle, sondern eine Einschränkung. Denn C# hat kein Konzept für eine Einschränkung, die außerhalb einer Schnittstelle, es fehlen wesentliche Funktionen. Case in point:
Hier gibt es keinen Polymorphismus, generische verwendet, der tatsächliche Typ des Objekts und ruft den operator+=, aber dies scheitert, da kann es nicht sicher sagen, dass Sie, dass der Betreiber existiert. Die einfache Lösung ist, um es zu spezifizieren, die in der Einschränkung; die einfache Lösung ist unmöglich, weil die Betreiber sind statische Methoden können nicht in einer Schnittstelle und (hier ist das problem) Einschränkungen dargestellt, die als Schnittstellen.
Was C# braucht, ist ein echtes Hindernis geben, alle Schnittstellen wäre auch Einschränkungen, aber nicht alle Einschränkungen wären Schnittstellen dann könnte man dies tun:
Es wurde viel bereits die Rede, um zu einer IArithmetic für alle numerischen Typen zu implementieren, aber es gibt Bedenken über die Effizienz, da eine Einschränkung ist nicht ein vielgestaltiges Konstrukt, wodurch eine CArithmetic Einschränkung würde das problem lösen.
InformationsquelleAutor der Antwort Jeremy Sorensen
Da Schnittstellen sind in der Vererbung von Struktur und statische Methoden nicht Erben.
InformationsquelleAutor der Antwort Joel Coehoorn
Was Sie zu wollen scheinen, die erlauben würde, für eine statische Methode aufgerufen werden, sowohl über die Art oder jede Instanz dieses Typs. Dies würde zumindest das Ergebnis in Zweideutigkeit, die nicht ein wünschenswertes Verhalten.
Gäbe es endlose Debatten darüber, ob es darauf ankam, die beste Praxis ist und ob es da performance-Probleme auftreten, tun es die eine oder andere Weise. Indem Sie einfach es nicht unterstützen C# erspart uns sorgen machen.
Es ist auch wahrscheinlich, dass ein compilier, entsprach diesem Wunsch würde verlieren einige Optimierungen, die möglicherweise mit einem mehr strikte Trennung zwischen Instanz-und statischen Methoden.
InformationsquelleAutor der Antwort AnthonyWJones
Können Sie denken, das statische Methoden nicht-statische Methoden einer Klasse als verschiedene Schnittstellen. Bei Aufruf von statischen Methoden lösen, um das singleton-static-Objekt-Klasse, und nicht-statische Methoden beheben, um die Instanz der Klasse, die Sie beschäftigen. Also, wenn Sie statische und nicht-statische Methoden in einer Schnittstelle, Sie würden effektiv deklariert werden zwei Schnittstellen, wenn wir wirklich wollen-Schnittstellen werden verwendet, um auf einer zusammenhängenden Sache.
InformationsquelleAutor der Antwort Scott Langham
Um ein Beispiel zu geben, wo ich bin, fehlt entweder eine statische Implementierung von interface-Methoden oder welche Marke Brackett eingeführt, als die "sogenannten Typ-Methode":
Beim Lesen aus einer Datenbank Speicher, wir haben einen generischen DataTable-Klasse, mit der das Lesen aus einer Tabelle mit beliebiger Struktur. Alle Tabellen bestimmte Informationen in einer Klasse pro Tabelle enthält auch Daten für eine Zeile aus der DB und die umsetzen muss IDataRow-Schnittstelle. Enthalten in der IDataRow ist eine Beschreibung der Struktur der Tabelle aus der Datenbank gelesen. Die DataTable muss Fragen, für die datastructure von der IDataRow vor dem Lesen aus der DB. Derzeit sieht es aus wie:
Den GetDataStructure ist nur dann erforderlich, wenn für jede Tabelle zu Lesen, ist der Aufwand für die Instanziierung einer Instanz mehr ist minimal. Allerdings wäre es schön, in diesem Fall hier.
InformationsquelleAutor der Antwort
FYI: könnten Sie sich ein ähnliches Verhalten wie das, was Sie wollen durch die Schaffung von extension-Methoden für die Schnittstelle. Die Erweiterung der Methode wäre eine gemeinsame, nicht überschreibbare statische Verhalten. Aber, leider, diese statische Methode nicht Teil des Vertrages sein.
InformationsquelleAutor der Antwort Daniel Auger
Schnittstellen sind abstrakte Sätze definiert, die zur Verfügung stehenden Funktionen.
Ob eine Methode in die Schnittstelle verhält sich so, als statische oder nicht, ist eine Implementierung detail, das ausgeblendet werden soll, hinter der Schnittstelle. Es wäre falsch zu definieren, eine interface-Methode als statische, denn Sie wäre unnötig, zwingt die Methode implementiert werden, die in einer bestimmten Art und Weise.
Wenn waren die Methoden als static definiert, die Klasse, die das interface würde nicht so gekapselt wie es sein könnte. Kapselung ist eine gute Sache zu bemühen, für die im Objekt-orientierten design (ich will nicht gehen, warum, Lesen Sie hier: http://en.wikipedia.org/wiki/Object-oriented). Aus diesem Grund werden statische Methoden sind nicht erlaubt in Schnittstellen.
InformationsquelleAutor der Antwort Scott Langham
Statische Klassen sollten in der Lage sein, dies zu tun, so dass Sie verwendet werden können, allgemein. Ich musste stattdessen implementiert ein Singleton, um die gewünschten Ergebnisse zu erreichen.
Hatte ich eine Reihe von Statischen Business-Schicht Klassen, die implementiert CRUD-Methoden wie "Create", "Read", "Update", "Delete" für jeden entity-Typ wie "User", "Team", ect.. Dann erstellte ich eine base Kontrolle hatte, dass Sie eine abstrakte Eigenschaft für die Business-Schicht Klasse umgesetzt, dass die CRUD-Methoden. Dies erlaubte mir, automatisieren Sie die "Create", "Read", "Update", "Delete" Operationen von der Basis-Klasse. Ich musste ein Singleton, weil der Statische Einschränkung.
InformationsquelleAutor der Antwort Louis Rebolloso
Meisten Menschen scheinen zu vergessen, dass in OOP-Klassen, Objekte zu, und so haben Sie die Nachrichten, die aus irgendeinem Grund c# fordert, "die statische Methode".
Die Tatsache, dass Unterschiede existieren zwischen Instanz-Objekte und die Objekte der Klasse zeigt nur Fehler oder Unzulänglichkeiten in der Sprache.
Optimist über c# obwohl...
InformationsquelleAutor der Antwort Mar Bar
Die Tatsache, dass eine statische Klasse ist implementiert in C#, die von Microsoft erstellen eine spezielle Instanz einer Klasse mit der statischen Elemente ist nur eine kuriosität, wie die statische Funktionalität erreicht wird. Es ist nicht ein theoretischer Punkt.
Schnittstelle SOLLTE ein Deskriptor für die Klasse, interface - oder wie es ist, interagiert mit, und das sollte zählen Wechselwirkungen, die statisch sind. Die Allgemeine definition der Schnittstelle (von Meriam-Webster): der Ort oder Bereich, an dem verschiedene Dinge treffen und mit Ihr zu kommunizieren oder sich gegenseitig beeinflussen. Wenn du weglassen, statische Komponenten einer Klasse oder statische Klassen völlig, wir ignorieren die großen Abschnitte, wie diese bad boys interagieren.
Hier ist ein sehr klares Beispiel dafür, wo in der Lage, Schnittstellen zu nutzen, die mit statischen Klassen, wäre hilfreich:
Derzeit Schreibe ich die statischen Klassen, die diese Methoden ohne jede Art von überprüfung, um sicherzustellen, dass ich habe nichts vergessen. Ist wie bei den schlechten alten Tagen der Programmierung, bevor Sie OOP.
InformationsquelleAutor der Antwort Thomas Phaneuf
C# und die CLR unterstützen sollte statische Methoden in interfaces, wie Java funktioniert. Der static-Modifizierer ist Teil eines Vertrages, definition und tut, eine Bedeutung haben, die speziell für das Verhalten und die return-Wert nicht variieren base-Instanz auf, obwohl es vielleicht noch schwanken von Aufruf zu Aufruf.
Sagte, ich empfehlen, dass wenn Sie möchten, um eine statische Methode in einem interface und nicht, verwenden Sie eine annotation statt. Sie erhalten die Funktionalität, die Sie suchen.
InformationsquelleAutor der Antwort Daniel Barbalace
Ich glaube, die kurze Antwort ist "weil es null nutzen".
Zum Aufruf einer interface-Methode, müssen Sie eine Instanz des Typs. Von Instanz-Methoden, die Sie anrufen können statische Methoden, die Sie möchten.
InformationsquelleAutor der Antwort mackenir
OK, hier ist ein Beispiel, dass ein "Typ-Methode". Ich erstellen eine Reihe von Klassen basierend auf XML-Quelle. Also ich habe ein
Funktion, die aufgerufen wird, die wiederum für jede Klasse.
Die Funktion muss statisch sein, da ansonsten verschwenden wir Zeit mit der Erstellung ungeeignete Objekte.
@Ian Boyde Punkte heraus, es könnte sein, getan in einer factory-Klasse, aber dies erhöht nur die Komplexität.
Wäre es schön, hinzufügen, um die Schnittstelle zu zwingen, Klasse implementors, um es zu implementieren. Dies würde nicht dazu führen, erhebliche overhead - es ist nur eine Compiler - /link-Zeit zu überprüfen und nicht auf die vtable.
Allerdings wäre es auch eine relativ kleine Verbesserung. Die Methode ist statisch, ich als Anrufer, muss ihn explizit aufrufen und erhalten so eine sofortige kompilieren Fehler, wenn es nicht umgesetzt. So dass es angegeben werden, die auf der Schnittstelle würde bedeuten, dieser Fehler kommt geringfügig früher in der Entwicklung Zyklus, aber dies ist trivial im Vergleich zu den anderen gebrochen-Schnittstelle Probleme.
Also es ist eine kleine potential-Funktion, die auf balance ist wahrscheinlich am besten Links heraus.
InformationsquelleAutor der Antwort Stephen Westlake
Ich denke, die Frage wird immer an der Tatsache, dass C# braucht ein weiteres Stichwort, denn genau diese Art von situation. Sie möchten eine Methode, deren return-Wert hängt nur von dem Typ, auf dem es aufgerufen wird. Sie können nicht nennen es "statisch", wenn genannten Art ist nicht bekannt. Aber sobald der Typ bekannt wird, wird es zu statisch werden. "Ungelöste statische" ist die Idee -- es ist nicht statisch, noch nicht, aber sobald wir wissen, dass die empfangende Art, wird es sein. Das ist ein ganz gutes Konzept, das ist der Grund, warum Programmierer immer wieder Fragen, für Sie. Aber es hat nicht so Recht passen in die Art und Weise der Designer Gedanken über die Sprache.
Da es nicht verfügbar ist, habe ich genommen, um mit nicht-statischen Methoden in der Weise, die unten gezeigt. Nicht gerade ideal, aber ich sehe keinen Ansatz, der mehr Sinn macht, zumindest nicht für mich.
InformationsquelleAutor der Antwort William Jockusch
Also, wenn Sie wollen, um access-Schnittstelle Vertrages Methoden haben Sie auf Objekt erstellen. Es ist immer das ist nicht erlaubt im Fall von Statischen Methoden. Statische Klassen ,Methoden und Variablen nie benötigen Objekte und laden in den Arbeitsspeicher ohne Anfertigung Objekt in diesem Bereich(oder Klasse), oder Sie können sagen: nicht erforderlich-Objekt erstellen.
InformationsquelleAutor der Antwort Sanjeev Saraswat
Wenn eine Klasse eine Schnittstelle implementiert,es ist die Schaffung Instanz für die Schnittstelle Mitgliedern. Während eine statische Typ nicht über eine Instanz,es gibt keinen Sinn, mit statischen Signaturen in einer Schnittstelle.
InformationsquelleAutor der Antwort Vinay Chanumolu