3 Stimmen

Unnötig langer Klassenname wegen der generischen Typen

Ich habe also eine Klasse mit einer Wrapper-Klasse innerhalb wie folgt:

public class RandomClass<TK, TV>
{
    internal class RandomClassWrapper<TK, TV> : RandomClass<TK, TV> {}
}

Der Grund dafür ist, dass der RandomClassWrapper die new Schlüsselwort, um das Verhalten einiger der Methoden in RandomClass zu überschreiben. Ich möchte nämlich, dass nur meine Bibliothek auf diese Funktionen zugreifen kann.

Sie muss auch einige der privaten Variablen in RandomClass ändern, weshalb sie verschachtelt ist.

Wenn ich dies jedoch initialisieren möchte, muss ich Folgendes tun

var rc = new RandomClass<int, int>.RandomClassWrapper<int, int>();

Warum ist das erste <int, int> erforderlich? Warum konnte es nicht einfach so geschrieben werden:

var rc = new RandomClass.RandomClassWrapper<int, int>();

Gibt es eine Möglichkeit, diese zusätzliche Eingabe zu vermeiden? <int, int> die sich in Dinge wie diese verwandeln können: <Dictionary<string, nameofclass>, List<thisistoolong>>

Das ist eine Übertreibung, aber Sie verstehen, was ich meine. Es ist eine enorme Platzverschwendung, wenn man diese Typen zweimal angeben muss.

Kann jemand einen anderen Ansatz vorschlagen?

Da dies dazu beiträgt, die Frage ein wenig zu klären, möchte ich auf diese beiden Kommentare hinweisen:

Ihre Frage lautet also: "Warum kann der Compiler die generischen Argumente für RandomClassWrapper nicht aus den Argumenten für RandomClass ableiten? - Ed S. vor 3 Minuten

@EdS. Das ist die eine Komponente der Frage, ja. Die andere, ist: Da dies nicht möglich ist, gibt es einen alternativen Ansatz / Hack, der dies bereinigt und vermeidet, dass man die generischen Argumente zweimal eingeben muss. - caesay gerade jetzt

5voto

Jason Larke Punkte 4919

Die zweite Klasse ist in der äußeren generischen Klasse verschachtelt, so dass die Typumwandlung nicht erforderlich ist.

internal class RandomClassWrapper : RandomClass<TK, TV> {}

Sollte korrekt kompiliert werden, müssen Sie nur einen Satz von Generika angeben, da die verschachtelte Klasse automatisch die Typen teilt:

var rc = new RandomClass<int, int>.RandomClassWrapper();

Sie müssen sich darüber im Klaren sein, dass der Compiler unter der Haube neue Klassendefinitionen für jeden unterschiedlichen Satz von generischen Typen generiert (eine schlechte Formulierung, wie ich finde). Das bedeutet, dass

RandomClass<int, int> ist bereits eine andere Definition als RandomClass<string, string> und somit ist ihre interne verschachtelte Klasse auch bereits in einer separaten generischen Definition enthalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X