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()
{
}
}
+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
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. –
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