2010-12-13 89 views
3

Dans un espace de noms, est-il possible de fournir un alias pour une classe? et si non, pourquoi pas? Par exemple, si j'avais plusieurs bibliothèques de choses dérivées d'une classe de base contenue, mais nommée, mais voulant l'aliaser comme "BaseClass", tout en conservant son nom de classe réel ("HtmlControl").Une classe peut-elle être aliasée en C#?

Alors les consommateurs pourraient toujours venir et étendre de HtmlControls.BaseClass, sans avoir à deviner de quelle classe il vient vraiment.

+0

Non. Il n'est pas possible de créer un "alias". L'approche 'using' crée un alias * local * - il n'est pas exposé au-delà du code [source] dans la portée. Un type factice peut être capable de simuler un "alias". –

+0

Je suis curieux de savoir ce que vous espérez obtenir si vous étiez en mesure de le faire. Il y a peut-être une meilleure façon d'accomplir ce que vous essayez de faire. – poindexter12

+0

@poindexter, laissez-moi voir si je peux expliquer. Dites que je fournis une bibliothèque destinée au consommateur pour utiliser les classes ou en dériver de nouvelles de la classe de base. Continuant avec mon exemple, je veux que les consommateurs dérivent de nouveaux contrôles Html de ma classe de base. Maintenant ajoutez que j'ai 5 ou 50 ou 500 segments d'espace de noms suivant le modèle, au lieu que le consommateur doive rechercher de la documentation sur chacun d'eux, il peut vérifier si j'ai fourni le "indice" com.example.BaseClass dont il peut dériver rapidement, plutôt que de lire la documentation pour chacun. –

Répondre

1

Il n'y a vraiment pas un moyen idéal pour faire en C#/NET.. Ce que vous pouvez faire est d'avoir une BaseClass publique qui hérite d'une classe interne. Vous pouvez modifier cet héritage en interne sans casser vos consommateurs tant que l'interface avec la classe reste intacte.

public class PublicBaseClass : SomeInternalClass { 

} 

Les consommateurs héritent de PublicBaseClass, et aussi longtemps que vous êtes prudent, vous pouvez changer ce que SomeInternalClass est que vous le souhaitez.

+0

Les classes 'public' ne peuvent pas hériter des classes' internal' - c'est une erreur de compilation. – adrianbanks

+0

Ah c'est vrai. Donc vraiment ce que l'OP veut n'est pas trop faisable IMO. –

+0

Les classes publiques peuvent hériter des classes avec un constructeur interne ou privé. Malheureusement, la seule façon d'utiliser une classe avec un constructeur privé est d'avoir d'autres classes imbriquées à l'intérieur. – supercat

4
using SomeClass = Large.Namespace.Other.FunkyClass; 

class Foo : SomeClass 
{ 
} 
+2

Cela ne répond pas vraiment à la question car il veut que les consommateurs reçoivent l'alias. Ici, le consommateur crée son propre alias. –

+0

Cet aliasing doit être fait par l'implémenteur (celui qui dérive de 'BaseClass' /' HtmlControl' dans l'exemple). Ce n'est pas utile pour cacher les détails des exécutants. – bdukes

+1

True. La seule autre option est de créer plus de classes qui "cachent" le détail. c'est-à-dire: des classes inutiles qui n'ajoutent aucune valeur. Les personnes qui utilisent/héritent de ces classes * veulent * les détails. Tenter de cacher le "détail" purement en changeant le nom et en ajoutant une autre classe à la hiérarchie est inutile. Si le nouveau nom masque toute l'idée de ce que les clients implémenteraient, vous introduisez un monde de souffrance alors que les gens découvrent un comportement auquel ils ne s'attendaient pas. Utilisation d'alias, ou n'utilisez rien du tout. –

1

Vous pouvez créer une classe fictive qui hérite juste HtmlControl sans ajouter d'autres fonctionnalités:

public class BaseClass : HtmlControl {} 
+0

Cela vient évidemment à condition que 'HtmlControl' soit' public' (pas 'internal'). Mais cela vaut pour toutes les suggestions postées jusqu'ici;) –

0

Le plus proche que je connais est de personnaliser votre déclaration en utilisant:

using BaseClass = HtmlControls.BaseClass; 

Ceci est normalement utilisé pour éviter toute ambiguïté entre les classes avec le même nom dans différents espaces de noms utilisés, sans avoir à se qualifier complètement l'un ou l'autre . Vos devs devraient l'inclure dans chaque fichier de code, donc probablement pas une bonne solution pour ce que vous faites.

En ce qui concerne dériver de BaseClass sans savoir de quoi vous êtes réellement issu, pas possible. Le compilateur doit, à un certain niveau, savoir quoi et où la classe parent est, ce qui signifie qu'elle doit être définie de manière statique quelque part dans le code.