2010-08-02 7 views
2

J'essaie de décider entre trois implémentations différentes. J'ai une interface IPerson, tous les types de personnes (c'est-à-dire policier, étudiant, avocat) mettent en œuvre ceci. Chaque type de personne doit avoir une AddressLocation différente (par exemple, la maison, le bureau, l'envoi). Cet emplacement ne change jamais, donc il peut être statique/en lecture seule. Les personnes sont gérées de manière générique, donc ma méthode save SavePerson (IPerson person) prend tout ce qui hérite de l'interface IPerson et j'ai une méthode LoadPerson (int ID) qui prend un identifiant.propriété publique vs static readonly

Ma solution initiale consistait à ajouter une propriété DefaultLocation à IPerson et n'avoir qu'un getter. De cette façon, je peux utiliser des méthodes génériques pour enregistrer les données. Un problème survient lorsque j'essaie de charger les données car je n'ai pas encore d'instance de la classe, donc je ne peux pas référencer la propriété. D'autre part, je peux créer une propriété DefaultLocation readonly statique publique sur chacun de mes types de personnes. Dans ce cas, je peux appeler Student.DefaultLocation et le passer dans la méthode de chargement de mes données.

De quel côté devrais-je aller et pourquoi? Les deux semblent avoir des avantages et des inconvénients. Une troisième option m'est venue alors que je tapais cette question: Et si j'utilisais une propriété publique en lecture seule qui pouvait être référencée sans instanciation de la classe et qui utilisait une propriété publique sans setter qui pourrait être appelée à partir des méthodes génériques?

conseils de Per Jon je suis allé avec:

public interface IPerson 
{ 
    LocationType DefaultLocation { get; } 
} 

public class PoliceOfficer : IPerson 
{ 
    public static readonly LocationType _DefaultLocationType = LocationType.Office; 
    public LocationType { get { return _DefaultLocationType; } } 
} 

Répondre

2

La dernière option sonne comme le meilleur pour moi - au moins si vous voulez l'emplacement de chaque type d'être disponible pour le reste du code. Si vous ne le faites pas, j'utiliserais simplement un champ static readonly privé dans chaque type, et retournerais cette valeur depuis la propriété d'instance. (Je suppose endroits sont immuables.)

Fondamentalement, vous utilisez polymorphisme ici dans un légèrement façon inhabituelle en ce qu'elle ne dépend pas de l'état de l'objet particulier ou tout comportement particulier, mais l'état en termes de type. Notez qu'en utilisant une propriété dans l'interface plutôt que d'avoir une classe de base abstraite avec un jeu de champs dans le constructeur, vous évitez d'avoir un champ par instance avec des données fondamentalement redondantes.

Questions connexes