2008-11-10 10 views
7

Ich habe eine öffentliche statische Klasse, in der ich eine ToString() -Methode haben möchte.Wie überschreiben Sie ToString in einer statischen Klasse?

I definiert haben es als public static string ToString(), aber erhalte die folgende Warnung:

'Class.ToString()' verbirgt geerbt Mitglieds Object.ToString() '. Fügen Sie das Schlüsselwort override hinzu, damit das aktuelle Mitglied diese Implementierung überschreibt. Andernfalls fügen Sie das neue Keyword hinzu.

Wenn ich das Schlüsselwort override hinzufügen bekomme ich diesen Fehler statt:

Ein statisches Element 'Class.ToString()' kann nicht als Überschreibung, virtuell markiert werden, oder abstrakte

Wie werde ich diese Warnung los und lassen Sie meine statische Klasse die ToString() -Methode haben.

Danke,
Keith

+0

Kann ich fragen, warum Sie das tun möchten? (Nur neugierig) – StingyJack

+0

Ich habe eine ErrorLog, die eine statische Klasse ist, durch meine Code kann ich ein ErrorLogItem zu ErrorLog hinzufügen. Der ErrorLog kann sich selbst in der Datenbank speichern, indem er alle ErrorLogItems speichert. Wenn auf die Datenbank nicht zugegriffen werden kann (schwerwiegender Fehler), kann ich das gesamte Protokoll in eine Zeichenfolge konvertieren und auf Festplatte speichern. –

+0

Zwei Dinge über diese Diskussion. Zuerst sollten Sie erwähnt haben, dass Sie .NET meinen, obwohl es aus der Rechtschreibung und der anschließenden Diskussion klar wurde. – orcmid

Antwort

12

Ja, mit dem Modifikator "new" wird die Warnung des Compilers tatsächlich stummgeschaltet, aber Sie sind , das eine Instanzmethode mit einer statischen Methode explizit ausblendet (). (Dies ist anders als das Überschreiben der Methode.) In der Regel möchten Sie eine Instanzmethode nur aus sehr guten Gründen ausblenden. Sie sollten sie jedoch nicht mit einer statischen Methode verstecken, da dies die Verhaltenssemantik des Aufrufs ändert. Jedes Objekt in .NET verfügt über eine Instanzmethode namens ToString() mit einem bestimmten Verhalten, das von Entwicklern erwartet wird. Indem Sie dieses Verhalten mit einer neuen statischen Methode verbergen, verändern Sie diese Erwartung, was zu viel Verwirrung führen kann.

Was sind Sie zum "Fadenziehen"? Statische Klassen enthalten normalerweise keinen internen Status, daher sollten keine internen Daten als logische Ausgabe eines ToString() - Aufrufs bereitgestellt werden. Möglicherweise möchten Sie Ihr Klassendesign überdenken oder einen anderen Methodennamen angeben, der den Zweck der Methode deutlicher anzeigt, ohne die Instanz ToString() auszublenden.

+0

Stolpern über das gleiche Problem: in einer Klasse, die logische Bedingungen abbildet: und, oder, nicht und so weiter, ich auch auf True und False, die statisch implementiert ist. Um komplexe Bedingungsbäume auszugeben, möchte ich die und ToString() "x und y", und ebenso will ich ToString() "true". wahr ist statisch - es kann nur einen geben. ;) Freut mich über Alternativen zu hören! –

3

In einer statischen Klasse, die Sie nicht ToString überschreiben können. .ToString ist eine Instanzmethode und per Definition kann eine statische Klasse nur statische Member haben.

Auch warum möchten Sie .ToString() überschreiben? Es gibt keine Möglichkeit, eine Instanz der Klasse zu erhalten und somit die Funktion nicht aufzurufen.

Hinweis: Die Verwendung der neuen Syntax überschreibt nicht .ToString. Es wird ein neues Mitglied erstellt, das völlig unabhängig von der Object.ToString() -Methode ist.

+0

Streng genommen, ist er nicht Objekt zu überschreiben.ToString, er versteckt es. Ich kann nicht sprechen, warum ... –

+0

Richtig. Der Titel seines Posts sagt jedoch "override", also wollte ich klarstellen, was das eigentlich im Vergleich zu meiner Antwort bedeutet. – JaredPar