Wie implementieren von virtuellen statischen Eigenschaften?
Soweit ich weiß C#
nicht die Unterstützung von virtuellen statischen Eigenschaften. Wie implementiert man solch ein Verhalten in C#
?
Ich archivieren wollen, dass alle abgeleiteten Klassen von einer Basisklasse überschreiben muss eine statische Eigenschaft. Immer einen abgeleiteten Typ, ich will den Zugriff auf eine statische Eigenschaft namens Identifier
Type t = typeof(DerivedClass);
var identifier= (String) t.GetProperty("Identifier", BindingFlags.Static).GetValue(null, null);
- statische member können nicht überschrieb (oder ist es "überschrieben"?) verzeihen Sie mein schlechtes Englisch =(
- Wie du gesagt hast, in C# nicht unterstützt, so können Sie es umsetzen.
- Sowieso, was Sie wollen, dass? das gleiche kann erreicht werden durch
Attributes
. - wenn Ihr wirklich
static
, warumvirtual
? - Mit einem Klasse Gerät, und Unterklassen für jedes konkrete Gerät: DeviceA, DeviceB. Jedes Gerät hat einen regex-string für die Identifikation. Öffnen eines Geräts handle ich die Abfrage der id. Jetzt kann ich die Suche nach dem richtigen Gerät Klasse
- Vielleicht können Sie eine virtuelle Instanz-Eigenschaft statt? Nicht Sie haben eine Instanz des
DeviceA
etc.? - Nein, ich werde nicht das Objekt, nur der Typ. Wenn ein statische Objekt wird nicht mehr benötigt.
- Mögliche Duplikate von Warum kann ich keine abstrakten statischen Methoden in C#?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Sie noch nicht über ein accpted Antwort über fünf Jahre später, lassen Sie mich es versuchen, (wieder) ..
Habe ich jemals daran gedacht, über die Neugierig Recurring Template Pattern als ein workaround, aber da Sie offenen
BaseClass
für die Vererbung wäre es nicht eine gute Idee sein. Möchten Sie vielleicht einen Blick auf Herr Lippert ' s Blog für ein besseres Verständnis des warum.Lösung 1: Sie müssen sich nicht registrieren, die ich nicht erkennen ..
test:
Dies ist ein relativ einfaches Muster, das durch die typeninitialisierer. Die
Register
Methode ist nur ausgesetzt abgeleiteten Klasse; und sowohl dieGetIdentifier
undRegister
Methoden eingeschränkt sind aufgerufen, mit einer Art argument, das abgeleitet ist vonBaseClass
. Obwohl wir nicht mit Gewalt in den abgeleiteten Klassen zu überschreiben nichts, wenn Sie nicht selbst registrieren,GetIdentifier
es nicht wiedererkennt und zurücknull
.Lösung 2: Bevor Sie zeigen Ihre Identität, das ich Sie kaufen ein Standard. Wer Sie denken, Sie sind, glaube ich -- so lange, wie es keine Mehrdeutigkeit.
und der test:
Anscheinend ist dies eine kompliziertere Lösung. Wie Sie sehen können
idBeforeInstantiation
undidAfterInstantiation
sind unterschiedlich, aber Sie sind entweder ein Gültiger Bezeichner fürDerivedClassA
.m_identities
enthält die Letzte Aktualisierung Bezeichner für jede abgeleitete Klasse undm_aliases
enthält alle Bezeichner Aliase für die abgeleiteten Klassen. Da die Kombination von virtuellen und statische ist nicht eine Funktion der Sprache, die derzeit(noch nie ..), wenn wir wollen, dass die Durchsetzung der überschreiben dann müssen wir es durch einige Abhilfe. Wenn Sie wählen, solution2, möchten Sie vielleicht, um implemenet Sie eigeneUpdateAlias
um zu verhindern, dass die abgeleiteten Klassen, die von der Bereitstellung von zu viel verschiedene Aliase für eine einzige Art, obwohl Sie alle gültig sein. Die Letzte Anweisung in der Prüfung sind, setzen Sie bewusst, um zu demonstrieren, den Konflikt von Bezeichnern.Für diese beiden Lösungen sind sorgfältig entworfen, für Ihre Betrachtung der nicht zu instanziieren den abgeleiteten Klassen, keiner von Ihnen erfordert, dass.
Einfach ausgedrückt, Sie können nicht, so dass ich demütig vorschlagen, dass Sie lassen Sie es und versuchen etwas anderes.
Finden Sie die Antwort in diese SO post. Wenn Sie könnte die Implementierung einer solchen Funktion, die Sie hätte ernst Probleme mit der Vererbung.
Dort gewesen, getan, dass. Nachdem ich wieder zur besinnung kam, ging ich für eine regelmäßige Vererbung Ansatz. Ich denke, Sie sollten wahrscheinlich das gleiche tun.
Einen anderen Weg, dies zu tun, ist es nicht erforderlich eine Klasse registriert werden, aber erfordert ein wenig zusätzliche Arbeit zu schaffen, ist eine statische Klasse, hält die "statischen" Daten, die für jede abgeleitete Klasse Typ und eine Konstante/statischer Wert aus der statischen Klasse. Lassen Sie mich erklären die Besonderheiten dieses Ansatzes.
Einen großen Grund dafür, dass eine statische Eigenschaft, die immer das gleiche für jedes Mitglied der Klasse ist, um zu vermeiden, unnötigen Speicher zu verwenden und die Wiederholung. Während die Methode demonstriert hier nicht vermeiden diese gänzlich, ist es immer noch umgeht die meisten der "extra" - overhead. Der einzige Anwendungsfall, der dem Beispiel unten nicht erfüllt ist, wenn der Grund für die Verwendung einer statischen Eigenschaft, so dass Sie nicht haben, um eine Instanz haben, da müssen Sie eine Instanz haben, um auf die Daten.
Wenn Sie benötigen ein virtuelles Feld oder eine Eigenschaft, die immer die gleichen für jedes Mitglied der Klasse (statisch), verwenden Sie eine nicht-statische Konstanteneigenschaft, dass gibt eine "Konstante" oder statische Daten wie diese: