93 votes

Comment puis-je aliaser un nom de classe en C #?

je veux créer un alias pour un nom de classe. La syntaxe suivante serait parfait:

public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
   ...
}

public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;

mais il ne compile pas.


Exemple

Remarque Cet exemple est fourni pour convience seulement. Ne pas essayer de résoudre ce problème en suggérant l'évolution de la conception de l'ensemble du système. La présence, ou l'absence de cet exemple ne change pas la question d'origine.

Le code existant dépend de la présence d'une classe statique:

public static class ColorScheme
{
   ...
}

Ce schéma de couleur est la Outlook 2003 schéma de couleur. je veux vous présenter un Outlook 2007 schéma de couleurs, tout en conservant la Outlook 2003 schéma de couleur:

public static class Outlook2003ColorScheme
{
   ...
}

public static class Outlook2007ColorScheme
{
   ...
}

Mais je suis toujours aux prises avec le fait que le code dépend de la présence d'une classe statique appelé ColorScheme. Ma première pensée a été de créer un ColorScheme classe que je vais descendre, soit à partir d'Outlook2003 ou Outlook2007:

public static class ColorScheme : Outlook2007ColorScheme
{
}

mais vous ne pouvez pas descendre d'une classe statique.

Ma prochaine idée a été de créer la statique ColorScheme classe, mais de faire de la Outlook2003ColorScheme et Outlook2007ColorScheme classes non-statique. Ensuite, une variable statique statique ColorScheme classe peut pointer vers le "vrai" schéma de couleur:

public static class ColorScheme
{
    private static CustomColorScheme = new Outlook2007ColorScheme();
    ...
}

private class CustomColorScheme 
{ 
   ...
}

private class Outlook2008ColorScheme : CustomColorScheme 
{
    ...
}

private class Outlook2003ColorScheme : CustomColorScheme 
{
   ...
}

mais cela m'obligerait à convertir une classe composée entirly readonly Couleurs statiques dans substituables propriétés, puis mon ColorScheme classe aurait besoin d'avoir les 30 propriété getters thunk vers le bas dans le contenu de l'objet.

C'est juste trop tapé.

Donc ma prochaine pensée a été de faire un alias de la classe:

public static ColorScheme = Outlook2007ColorScheme;

Mais cela ne veut pas compiler.

Comment puis-je attribuer une classe statique dans un autre nom?


Mise à jour: quelqu'un Peut s'il vous plaît ajouter la réponse "Vous ne pouvez pas le faire en C#", si je peux marquer que l'on a accepté la réponse. Quelqu'un d'autre qui voudrait la réponse à la même question sera de trouver cette question, la accepté de répondre, et un certain nombre de solutions qui pourraient, ou non, être utile.

je veux juste fermer cette question.

137voto

Konrad Rudolph Points 231505

Si vous modifiez le nom de la classe d'origine, vous pouvez réécrire le code dépendant en utilisant un alias d'importation comme substitut typedef :

 using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;
 

Cela doit aller en haut du fichier / espace de noms, comme le font normalement les using s.

Je ne sais pas si cela est pratique dans votre cas, cependant.

25voto

mohammedn Points 1821

Vous pouvez créer un alias pour votre classe en ajoutant cette ligne de code:

 using Outlook2007ColorScheme = YourNameSpace.ColorScheme;
 

13voto

Ian Boyd Points 50743

Vous ne pouvez pas alias de nom de classe en C#.

Il y a des choses que vous pouvez faire qui ne sont pas des alias de nom de classe en C#.

Mais pour répondre à la question initiale: vous ne pouvez pas alias de nom de classe en C#.


Mise à jour: les Gens sont confus pourquoi using ne fonctionne pas. Exemple:

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

ColorScheme.cs

class ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

Et tout fonctionne. Maintenant, je veux créer une nouvelle classe, et alias ColorScheme à celle-ci (de sorte que le code ne doit être modifié):

ColorScheme.cs

using ColorScheme = Outlook2007ColorScheme;

class Outlook2007ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

Ohh, je suis désolé. Ce code ne compile pas:

enter image description here

Ma question est de savoir comment les alias d'une classe en C#. Il ne peut pas être fait. Il y a des choses que je peux faire qui ne sont pas des alias de nom de classe en C#:

  • changement de tout le monde qui dépend ColorScheme de using ColorScheme à la place (changement de code solution car je ne peux pas alias)
  • changement de tout le monde qui dépend ColorScheme à utiliser un modèle de fabrique un polymorphe de la classe ou de l'interface (changement de code solution car je ne peux pas alias)

Mais ces solutions impliquent casser le code existant: pas une option.

Si les gens dépendent de la présence d'un ColorScheme classe, j'ai fait copier/coller ColorScheme classe.

En d'autres termes: je ne peux pas alias de nom de classe en C#.

Cela contraste avec d'autres langages orientés objet, où j'ai pu définir l'alias:

ColorScheme = Outlook2007ColorScheme

et j'aurais fait.

12voto

Chris Marasti-Georg Points 17023

Vous voulez une (Usine|Singleton), en fonction de vos besoins. Le principe est de faire en sorte que le code du client n'a pas à savoir quel schéma de couleur il est. Si le choix des couleurs doit être d'application large, un singleton doit être fine. Si vous pouvez utiliser un système différent dans différentes circonstances, une Usine modèle est probablement la voie à suivre. De toute façon, lorsque le schéma de couleur qui doit changer, le code ne doit être changé en un seul endroit.

public interface ColorScheme {
    Color TitleBar { get; }
    Color Background{ get; }
    ...
}

public static class ColorSchemeFactory {

    private static ColorScheme scheme = new Outlook2007ColorScheme();

    public static ColorScheme GetColorScheme() { //Add applicable arguments
        return scheme;
    }
}

public class Outlook2003ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.LightBlue; }
   }

    public Color Background {
        get { return Color.Gray; }
    }
}

public class Outlook2007ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.Blue; }
   }

    public Color Background {
        get { return Color.White; }
    }
}

10voto

dpurrington Points 1129

essaye ça:

 using ColorScheme=[fully qualified].Outlook2007ColorScheme
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X