2009-01-22 4 views
2

Je trouve souvent la nécessité de faire quelque chose le long de ces lignes:Comment traiter ne pas pouvoir définir des types dans une interface en C#

public class OperationResult 
{ 
    bool succes; 
    SomeOtherObject someobject; 
} 


public interface ICanDoSomethingWeird 
{ 
    OperationResult DoMyThing(); 
} 

Lorsque le OperationResult est vraiment une classe qui appartient à l'interface ICanDoSomethingWeird . Je trouve cela très ennuyeux de ne pas pouvoir le placer dans l'espace de noms de l'interface. Je me demande comment les autres traitent de cela. Est-ce que vous le collez simplement dans l'espace de noms global? ou juste un espace de noms à partir de l'espace de noms où se trouve l'interface?

Mon approche actuelle est de faire renommer la classe OperationResult à ICanDoSomethingWeird_OperationResult, mais je ne suis pas très impressionné par la façon dont Gracieuse est :)

Quelqu'un a une meilleure solution?

Répondre

10

Si OperationResult est un type utilisé uniquement par ICanDoSomethingWeird et les clients de ICanDoSomethingWeird, il appartient dans le même « contexte » que ICanDoSomethingWeird. Autrement dit, il appartient dans le même espace de noms comme ICanDoSomethingWeird:

namespace MyNamespace 
{ 
    public class OperationResult {} 

    public interface ICanDoSomethingWeird 
    { 
     OperationResult DoMyThing(); 
    } 
} 

sur le code Pensez client. Préférez-vous ceci:

using MyNamespace; 

ICanDoSomethingWeird myWeirdThing = ...; 
ICanDoSomethingWeird.OperationResult result = myWeirdThing.DoMyThing(); 

ou ceci:

using MyNamespace; 

ICanDoSomethingWeird myWeirdThing = ...; 
OperationResult result = myWeirdThing.DoMyThing(); 

Ce dernier a plus de sens pour moi, et est la seule option où les interfaces sont concernées. Vous ne pouvez pas déclarer les types internes dans les interfaces. Et ne notez les general advice en ce qui concerne les types imbriqués:

NE PAS utiliser des types imbriqués si le type est susceptible d'être référencé en dehors du de type contenant.

0

Vous pouvez définir l'interface en tant que classe abstraite, puis définir une classe interne publique.

public interface ICanDoSomething 

public abstract class AbstractCanDoSomething 
{ 
    public class OperationResult 
    { 
      public bool SomeValue { get; set; } 
      public int SomeOherVAlue { get; set; } 
    } 

    public abstract OperationResult DoMyThing(); 
} 
+0

Le problème avec l'utilisation d'un résumé est que vous ne pouvez pas simplement choisir de l'implémenter comme vous le feriez pour une interface. Il doit être soigneusement inclus dans la hiérarchie de classe au début de la conception du code. – AnthonyWJones

1

Une interface ne définit aucune implémentation. En incluant une classe, votre interface inclut effectivement une implémentation. Les classes imbriquées ont pour but d'aider l'implémentation de classe qui le définit.

Les classes imbriquées ne doivent pas être utilisées comme si la classe avait un mérite en dehors de son utilisation avec la classe conteneur. Une classe ne doit pas être utilisée comme substitut d'un espace de noms pour définir d'autres classes.

Si une interface définit un comportement qui nécessite l'utilisation d'une classe qui n'existe pas encore pour le moment, il est logique de créer cette classe dans le même espace de noms que l'interface.

Questions connexes