2010-11-25 16 views
1

L'extrait de code ne compilerait pas que cela signifiait seulement pour mettre en valeur ce que je voudrais obtenir: Dire que j'ai une interface:Quel est le meilleur modèle OOP pour faire en C#

 public Interface IWalker 
     { 
      //Compiles but not what I need 
      double DistanceTravelled {get; set;} 

      //Compiler error - cant be private for set, but that's what I need 
      //double DistanceTravelled {get; private set;} 
     } 

     public abstract AbstractWalker : IWalker 
     { 
      //Error:Cannot implement - but thats what I need 
      //protected double DistanceTravelled {get; private set} 

      //Error the set is not public and I dont want the property to be public 
      //public double DistanceTravelled { get;private set; } 

      //Compiles but not what i need at all since I want a protected 
      // property -a. and have it behave as readonly - b. but 
      // need it to be a part of the interface -c. 
      public double DistanceTravlled {get; set;} 

     } 

Tout mon béton Les instances de AbstractWalker sont en fait de type IWalker. Quel serait le meilleur moyen d'obtenir le design que j'ai spécifié dans l'extrait?

+2

Y a-t-il une raison pour que ce soit une interface? Les classes abstraites sont fondamentalement la même chose, sauf que vous pouvez ajouter des méthodes protégées. –

+0

trouvé cela, peut-être que cela aide? http://stackoverflow.com/questions/2420133/do-adding-properties-to-an-interface-prevent-creating-private-protected-set/2420147#2420147 – Ozzy

+0

@Mike, oui, donc j'ai le choix programmer contre l'un ou l'autre. – dexter

Répondre

10

Si vous voulez ensemble privé, spécifiez juste un get dans l'interface:

public interface IWalker 
    { 
     double DistanceTravelled {get; } 
    } 

l'implémenteur de IWalker peut alors spécifier set privé:

public class Walker : IWalker 
    { 
     public double DistanceTravelled { get; private set;} 
    } 
0

Il y a une faille dans votre conception. Une interface est utilisée pour décrire le 'contrat public' de votre API, il est donc très étrange que vous vouliez (a) un setter privé et (b) une implémentation protégée.

  • Le setter privé au niveau de l'interface ne fait pas de sens (voir Mark bruyères réponse si vous voulez une propriété avec seulement un getter sur l'interface)
  • La mise en œuvre protégée est également étrange, car en mettant en œuvre la interface la propriété est publique de toute façon.

Vous devrez fournir plus d'informations sur votre conception si vous avez besoin de plus d'aide.