Ich habe zwei verschiedene Arten von Strings, die ich verteile und in meinem Code verwende, und die beiden sind eng miteinander verwandt, sollten aber nicht füreinander verwechselt werden. Ich dachte, ich könnte mir helfen, Fehler zu vermeiden, indem ich zwei Klassen habe, die nur Strings sind, aber unterschiedliche Namen haben, so dass Methodensignaturen (und Typinkompatibilität im Allgemeinen) die semantische Bedeutung der zwei verschiedenen Stringtypen erzwingen würden. Zur gleichen Zeit wollte ich nicht von something = "foo";
zu something.Value = "foo";
in hundert Orten umgestalten.Wie kann ich abgeleitete "Shell" -Klassen deklarieren, die nur als Umbenennungen fungieren?
Erster Gedanke:
private class FirstKind : string { }
private class SecondKind : string { }
Die Idee ist, dass, wenn ich
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
haben, und dann versuchen, es mit MyMethod(secondKindVar, firstKindVar);
zu nennen, ich einen Compiler-Fehler bekommen würde.
Wand Ich schlug: string
ist versiegelt.
Zweiter Gedanke: Erstellen Sie generische KindOf<T>
Klasse, die nichts tun würde, aber nehmen und spuckt den Wert mit impliziten Konvertierungsoperatoren aus. Wie folgt aus:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}
So kann ich etwas tun könnte:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
Wand schlug ich: nichts von der KindOf<T>
Klasse scheint zu erben: weder Konstruktoren noch Operatoren in den abgeleiteten Typen existieren, was bedeutet, Ich muss im Wesentlichen die gesamte Basisklasse in den abgeleiteten Klassen neu implementieren. Code kopieren. Jawohl.
So fühle ich mich, als würde ich hier etwas Grundlegendes vermissen und vielleicht bin ich im Unkraut. Irgendwelche Ideen für das, was ich versuche zu tun?
Vielleicht könnten Sie klären, was "zwei verschiedene Arten von Strings" bedeutet? –
Von Kopf bis Kopf müssen Sie möglicherweise nur die impliziten Operatoren und Konstruktoren in den Unterklassen implementieren. Ja, so ähnlich wie beim Kopieren von Code, aber es verwendet zumindest keinen verschachtelten Prozess oder Vererbung, wenn die Vererbung wirklich nichts kommuniziert _real_ (rhetorisch, was ist ein "KindOf" überhaupt und bedeutet es wirklich irgendetwas?) Und ist einfach dort, um Code-Duplizierung über Klassen zu reduzieren, die nichts gemeinsam haben außer ähnlicher Syntax (aber verschiedene Verwendungen) –
Vereinbart, die Klassen sollten wirklich nicht in der gleichen Vererbungshierarchie sein, besonders wenn man bedenkt, dass man sich nicht auf sie beziehen will durch einen gemeinsamen Typ wollen Sie, dass sie unterschiedlich bleiben. – Servy