2010-03-10 8 views
5

Je suis curieux de savoir quelles sont les bonnes pratiques en ce qui concerne certains scénarios impliquant des types imbriqués dans .NET. Supposons que vous ayez une classe Wheel, et que la classe Wheel contienne des objets Bearing. Un objet Roulement n'a de sens que dans une roue et vous ne voulez pas qu'il soit créé de manière indépendante, il serait donc logique d'avoir la classe Bearing imbriquée dans l'objet Wheel. Cependant, disons que vous avez un scénario dans lequel vous devez maintenant lire une propriété Wheel.Bearings en dehors de la classe Wheel. Cela nécessiterait désormais de rendre publique la classe Bearing imbriquée.Types imbriqués publics

Dans cette situation, quelle est la meilleure option?
1 - Créer une classe de roulement publique imbriqué dans la classe de roue
2 - Créer une classe indépendante de roulement qui prend un objet de roue dans son constructeur
3 - Créer un espace de noms de roue et de créer une classe indépendante de roulement dans cet espace de noms.
4 - Quelque chose d'autre?

MISE À JOUR: Je suis en train de mettre à jour ceci avec plus de détails et de refléter certaines des suggestions jusqu'à présent. ClassParent est la classe parente, ClassChild est la classe enfant. ClassChild est TOUJOURS un enfant de ClassParent, cela n'a pas de sens d'exister seul. Le problème est que ClassChild a quelques propriétés qui doivent être exposées publiquement, tandis que tout le reste ne devrait être appelé que depuis ClassParent. Un exemple est une fonction ClassChild.Delete qui ne devrait pas être exposée publiquement car elle ne devrait être appelée que depuis ClassParent car ClassParent doit effectuer le nettoyage et les modifications appropriés. Après avoir passé en revue les suggestions, le design que j'ai trouvé semble un peu sale pour moi, alors j'ai pensé que je demanderais des commentaires. J'ai:

public class Parent 
{ 
    ChildNested childObj 

    public DeleteChild() 
    { 
     //expose this method publically 
     childObj.DeleteChild() 
     //other functionality 
    } 

    public Child GetChild() 
    { 
     //expose Child, not ChildNested publically 
     return childObj 
    } 

    private class ChildNested:Child 
    { 
     public Child() 
     { 
       Base.Child() 
     } 
     public DeleteChild() 
     { 
       Base.Delete() 
     } 
    } 

public abstract class Child 
{ 
protected Child() 
    { 
    } 
protected Delete() 
    { 
    } 
    public PublicPropertyToExpose() 
    { 
    }  
} 

Répondre

8

Le meilleur design est ici pour créer une classe Bearing publique avec un constructeur internal et créer des instances de celui-ci dans la classe Wheel.

Si la classe a besoin d'accéder Bearing membres privés de la classe Wheel, vous pouvez faire la classe Bearing publique abstract, puis faire une implentation en béton comme private classe imbriquée à l'intérieur de Wheel. En général, you should not make public nested types.

+0

+1. Je suis entièrement d'accord. Les types imbriqués sont difficiles à lire, difficiles à suivre. Lorsque vous programmez contre eux, vous devez toujours spécifier le type out, ce qui est assez ennuyeux. – Steven

+0

Mais que se passerait-il si le scénario était que le roulement ne peut jamais et ne devrait jamais exister sans roue? Parce que dans ce cas, vous pouvez créer un objet Bearing sans roue. Un exemple est une classe Keyboard et une classe Key, vous ne pouvez jamais avoir une clé keybody sans clavier. –

+0

Y a-t-il un moyen de créer une classe qui en dérive deux (ou plus), mais qui n'est pas "publiquement" dérivable, sauf en ayant la classe de base public, avec un constructeur privé, et en ayant les classes dérivées imbriqué en son sein? Lorsque je conçois des hiérarchies de classes, je me retrouve souvent coincé dans un coin où les choses que je veux être des classes publiques sont coincées dans d'autres classes. Y a-t-il un moyen de contourner cela, autre que de donner aux choses une plus grande portée que ce que je veux vraiment? – supercat

1
  • Créer une classe indépendante de roulement avec constructeur privé
  • Créer une classe d'usine qui instancier la classe de roulement donné une classe de roue
+0

Vous pouvez également utiliser une méthode sur une roue qui renvoie un relèvement, par exemple "CreateBearing". –

1

Je voudrais tester « roulement » de manière indépendante, donc je aller pour la 2ème option.

1

Un palier peut exister seul, car il est probablement assez utile pour être utilisé ailleurs dans le monde, en dehors d'une roue.

Une roue est agrégée en utilisant des roulements, mais une roue ne définit pas de roulement. Les roulements sont utiles et peuvent être utilisés dans d'autres choses que des roues.

Le fait que vous ayez besoin d'une propriété publique pour un relèvement indique qu'il doit s'agir d'une classe publique, en dehors de Wheel.

En outre, que se passe-t-il lorsque vous réinventez la roue (nous le faisons tous ...). Peut-être que vous utilisez un nouveau "Air Bearing", tel qu'il existe dans les micro-turbines, maintenant vous avez plusieurs types de roulements dans la classe Wheel, dont certains ne sont pas utilisés.

Je mettrais le roulement dans le même espace de noms, mais pas dans la classe Wheel. Rarement je trouve un besoin de classes internes. Habituellement, une classe anonyme comble toutes les lacunes dont j'ai besoin.

Questions connexes