Ich möchte einen Alias für einen Klassennamen erstellen. Die folgende Syntax wäre perfekt:
public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
...
}
public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;
aber es wird nicht kompiliert.
Beispiel
Hinweis Dieses Beispiel dient nur der Übersichtlichkeit. Versuchen Sie nicht, dieses spezielle Problem zu lösen, indem Sie vorschlagen, das Design des gesamten Systems zu ändern. Das Vorhandensein oder Fehlen dieses Beispiels ändert nichts an der ursprünglichen Frage.
Einige vorhandene Codes hängen vom Vorhandensein einer statischen Klasse ab:
public static class ColorScheme
{
...
}
Dieses Farbschema ist das Outlook 2003-Farbschema. Ich möchte ein Outlook 2007-Farbschema einführen und dabei das Outlook 2003-Farbschema beibehalten:
public static class Outlook2003ColorScheme
{
...
}
public static class Outlook2007ColorScheme
{
...
}
Aber ich bin immer noch mit der Tatsache konfrontiert, dass der Code vom Vorhandensein einer statischen Klasse namens abhängt ColorScheme
. Mein erster Gedanke war, eine ColorScheme
Klasse zu erstellen , die ich entweder erben werde Outlook2003
oder Outlook2007
:
public static class ColorScheme : Outlook2007ColorScheme
{
}
Sie können jedoch nicht von einer statischen Klasse erben.
Mein nächster Gedanke war, die statische ColorScheme
Klasse zu erstellen , aber make Outlook2003ColorScheme
und Outlook2007ColorScheme
Klassen nicht statisch. Dann kann eine statische Variable in der statischen ColorScheme
Klasse auf eines der "echten" Farbschemata verweisen:
public static class ColorScheme
{
private static CustomColorScheme = new Outlook2007ColorScheme();
...
}
private class CustomColorScheme
{
...
}
private class Outlook2008ColorScheme : CustomColorScheme
{
...
}
private class Outlook2003ColorScheme : CustomColorScheme
{
...
}
Dafür müsste ich jedoch eine Klasse konvertieren, die vollständig aus schreibgeschützten statischen Farben besteht, in überschreibbare Eigenschaften, und dann ColorScheme
müsste meine Klasse die 30 verschiedenen Eigenschafts-Getter in das enthaltene Objekt einbinden .
Das ist einfach zu viel Tippen.
Mein nächster Gedanke war also, die Klasse zu aliasen:
public static ColorScheme = Outlook2007ColorScheme;
Das lässt sich aber nicht kompilieren.
Wie kann ich eine statische Klasse in einen anderen Namen aliasen?
Update: Kann jemand bitte die Antwort "Sie können dies nicht in C # tun" hinzufügen , damit ich dies als akzeptierte Antwort markieren kann. Jeder andere, der die Antwort auf dieselbe Frage wünscht, findet diese Frage, die akzeptierte Antwort und eine Reihe von Problemumgehungen, die nützlich sein können oder nicht.
Ich möchte diese Frage nur abschließen.
quelle
interface
, die alle Ihre Klassen implementieren. Wie in der Antwort von chills42 erwähnt . Sie können dann einen "Service" oder eine "Factory" definieren, die ein Objekt zurückgibt, das diese Schnittstelle implementiert, abhängig von den aktuellen Umständen (z. B. Plattform / Betriebssystem) oder einer Konfigurationsdatei.Antworten:
Das kannst du nicht . Das nächstbeste, was Sie tun können , ist,
using
Deklarationen in den Dateien zu haben, die die Klasse verwenden.Sie können beispielsweise den abhängigen Code mithilfe eines Importalias (als Quasi-
typedef
Ersatz) neu schreiben :Leider muss dies in jeden Bereich / jede Datei gehen, die den Namen verwendet.
Ich weiß daher nicht, ob dies in Ihrem Fall praktisch ist.
quelle
using
muss zu jedem kaputten Code hinzugefügt werden. Außerdem wird negiert, dass der Wert einen einzelnen Alias hat, mit dem ich alle Benutzer der vorhandenenColorScheme
Klasse auf eine neue Klasse umstellen kann - ohne Änderungen. Mit anderen Worten: Ich möchte dieColorScheme
Klasse einer anderen Klasse zuordnen.Sie können einen Alias für Ihre Klasse erstellen, indem Sie folgende Codezeile hinzufügen:
quelle
Imports
. Liege ich falsch?using
Direktive in den Namespace einfügen, z. B. wenn Sie einen Alias Ihrer eigenen Klasse benötigen.Sie können einen Klassennamen in C # nicht wirklich als Alias verwenden. Sie können eine Problemumgehung mit der Verwendung üben, wie in anderen Antworten erläutert.
Es gibt Dinge, die Sie tun können, ohne einen Klassennamen in C # zu aliasen.
Um die ursprüngliche Frage zu beantworten: Sie können einen Klassennamen in C # nicht als Alias verwenden.
Update: Die Leute sind verwirrt, warum
using
es nicht funktioniert. Beispiel:Form1.cs
ColorScheme.cs
Und alles funktioniert. Jetzt möchte ich eine neue Klasse und einen Alias dafür erstellen
ColorScheme
(damit kein Code geändert werden muss ):ColorScheme.cs
Ohh, es tut mir leid. Dieser Code wird nicht kompiliert:
Meine Frage war , wie man alias eine Klasse in C #. Es kann nicht gemacht werden. Es gibt Dinge, die ich tun kann, die einen Klassennamen in C # nicht aliasen:
ColorScheme
anusing
ColorScheme
statt (Codeänderung Abhilfe , weil ich kann nicht Alias)ColorScheme
, ein Factory-Muster zu verwenden, in eine polymorphe Klasse oder Schnittstelle (Problemumgehung für Codeänderungen, da ich keinen Alias erstellen kann).Bei diesen Problemumgehungen wird jedoch vorhandener Code beschädigt: keine Option.
Wenn Leute von der Anwesenheit einer
ColorScheme
Klasse abhängig sind , muss ich tatsächlich eineColorScheme
Klasse kopieren / einfügen .Mit anderen Worten: Ich kann keinen Klassennamen in C # aliasen.
Dies steht im Gegensatz zu anderen objektorientierten Sprachen, in denen ich den Alias definieren könnte:
und ich wäre fertig.
quelle
Sie möchten einen ( Factory | Singleton ), abhängig von Ihren Anforderungen. Die Voraussetzung ist, dass der Client-Code nicht wissen muss, welches Farbschema er erhält. Wenn das Farbschema anwendungsweit sein soll, sollte ein Singleton in Ordnung sein. Wenn Sie unter verschiedenen Umständen ein anderes Schema verwenden, ist wahrscheinlich ein Factory-Muster der richtige Weg. In beiden Fällen muss der Code nur an einer Stelle geändert werden, wenn sich das Farbschema ändern muss.
quelle
Versuche dies:
quelle
Ich füge diesen Kommentar für Benutzer hinzu, die dies finden, lange nachdem OP ihre "Antwort" akzeptiert hat. Das Aliasing in C # funktioniert durch Angabe des Klassennamens unter Verwendung des vollständig qualifizierten Namespace. Einer der definierten Aliasnamen kann innerhalb seines Gültigkeitsbereichs verwendet werden. Beispiel.
Entschuldigung für den schnell eingegebenen Code, aber hoffentlich wird erklärt, wie dies implementiert werden sollte, damit Benutzer nicht irreführen, zu glauben, dass dies in C # nicht möglich ist.
quelle
namespace Fully.Qualified.Namespace{
public class Example {
...public void DoStuff(){
...}
...}
}
.Das Aliasing der Art und Weise, wie Sie es tun möchten, funktioniert in C # nicht. Dies liegt daran, dass das Aliasing über das erfolgt
using
Direktive erfolgt, die auf die betreffende Datei / den betreffenden Namespace beschränkt ist. Wenn Sie 50 Dateien haben, die den alten Klassennamen verwenden, bedeutet dies, dass 50 Stellen aktualisiert werden müssen.Trotzdem denke ich, dass es eine einfache Lösung gibt, um Ihre Codeänderung so gering wie möglich zu halten. Machen Sie die
ColorScheme
Klasse zu einer Fassade für Ihre Aufrufe der tatsächlichen Klassen mit der Implementierung und verwenden Sie dieusing
in dieser Datei, um zu bestimmen, welcheColorScheme
Sie verwenden.Mit anderen Worten, tun Sie dies:
Dann ändern Sie in Ihrem Code dahinter nichts:
Sie können dann die Werte
ColorScheme
von aktualisieren, indem Sie eine Codezeile aktualisieren (using CurrentColorScheme = Outlook2008ColorScheme;
) .Ein paar Bedenken hier:
ColorScheme
Klasse und zurOutlook2007ColorScheme
Klasse. Dies ist zusätzliche Arbeit, aber wenn es sich um echten Legacy-Code handelt, sollte dies nicht häufig vorkommen. Als Bonus wird der Code inColorScheme
so einfach, dass jeder mögliche Fehler sehr offensichtlich ist.ColorScheme
Klasse haben, die Sie ersetzen, können dieser und alle anderen Ansätze ein Problem darstellen. Ich würde empfehlen, dass Sie diese Klasse in etwas umbenennenColorSchemeOld
und dann über darauf zugreifenusing CurrentColorScheme = ColorSchemeOld;
.quelle
Ich nehme an, Sie können immer von der Basisklasse erben, ohne dass etwas hinzugefügt wird
AKTUALISIEREN
Aber wenn Sie die Möglichkeit haben, sich
class
selbst umzugestalten : Ein Klassenname ist normalerweise unnötig lang, danamespace
s fehlt .Wenn Sie sehen , wie Fälle
ApiLoginUser
,DataBaseUser
,WebPortalLoginUser
, ist in der Regel Hinweis auf fehlendenamespace
wegen der Furcht , dass der NameUser
könnte Konflikt.In diesem Fall können Sie jedoch einen
namespace
Alias verwenden , wie in den obigen Beiträgen erwähntBeachten Sie, wie die
class
Namen alle sindUser
, aber in verschiedenennamespace
s. Zitieren PEP-20: Zen of Python :Hoffe das hilft
quelle
new
Schlüsselwörter für solche Methoden zurückgreifen oder sogar Ihre eigenen ExtensionMethods entwickeln, oder? In jedem Fall bin ich der festen Überzeugung, dass Sie immer Vanilla Collection-Klassen (z. B. Dictionary, List, IEnumerable, IQueryable usw.) mit benutzerdefinierten Models / ViewModels / POCOs verwenden sollten. Wie Mvc es ausdrückt: Konvention über KonfigurationIColorScheme oColorScheme = ColorSchemeFactory.Create();
Vielleicht möchten Sie auch in Dependency InjectionIst es möglich, auf eine Schnittstelle umzusteigen?
Vielleicht könnten Sie eine
IColorScheme
Schnittstelle erstellen , die alle Klassen implementieren?Dies würde gut mit dem Fabrikmuster funktionieren, wie es von Chris Marasti-Georg gezeigt wird
quelle
Es ist eine sehr späte Teilantwort. Wenn Sie jedoch dieselbe Klasse 'ColorScheme' im selben Namespace 'Outlook' definieren, jedoch in separaten Assemblys, eine mit dem Namen Outlook2003 und die andere mit Outlook2007, müssen Sie nur auf die entsprechende Assembly verweisen .
quelle
Während die von Ihnen angeforderte Funktionalität nicht vorhanden ist und meine Antwort Ihre Frage per se nicht beantwortet, ist es möglich, die ColorScheme-Klasse intakt zu lassen und mit Veraltet zu markieren Attribut und dann die beiden anderen neuen Farbschema-Klassen hinzuzufügen.
Dies würde keine systemischen Änderungen erfordern und hält die veraltete Klasse isoliert.
quelle