2011-09-13 2 views
1

Disons que la classe A est abstraite et définit les propriétés en lecture seule que la classe B, qui en hérite, doit fournir. Est-il préférable pratique de définir des propriétés telles que abstrait ou tel que protégé:Héritage des propriétés en lecture seule: abstract ou set-protected

public abstract class A 
{ 
    public abstract int Value { get; } 
} 
public class B : A 
{ 
    public override int Value { get { return 1; } } 
} 

OU

public abstract class A 
{ 
    public int Value { get; protected set; } 
} 
public class B : A 
{ 
    public B() 
    { 
     Value = 1; 
    } 
} 

Je pense que la première solution est probablement mieux, mais je voudrais entendre d'autres opinions.

Répondre

0

Cela dépend de ce que vous entendez par lecture seule. Si vous voulez dire en lecture seule pour les appelants, alors je préférerais la deuxième solution.

La première solution force la classe enfant à implémenter get, ce qui est bon. Mais il interdit à l'enfant d'implémenter set (même protégé), ce qui est mauvais. Avec la seconde solution, toute l'interface Value est définie par la classe de base, ce qui est bon, et la classe child est toujours capable de définir Value quand elle le souhaite, ce qui est également bon. Si en revanche, en "lecture seule", vous voulez vraiment dire en lecture seule, en ce que même la classe enfant n'est pas autorisée à définir la valeur, alors la première solution est meilleure. Vous obtenez même la bonne erreur de compilation si vous essayez de le définir.

+0

Je vais accepter votre réponse car elle a quelques bons points et personne d'autre n'a contribué. Cependant dans l'intervalle j'ai fini par utiliser la solution 1. Considérez ce qui suit en utilisant la solution 2: une troisième classe C hérite de B et elle veut également exposer cette valeur. En outre, la valeur n'est pas quelque chose de constant mais de nombreuses méthodes dans B et C. Il peut arriver que B fournisse sa valeur lors de l'exécution de l'une de ses méthodes au lieu de ce que C devrait fournir. En d'autres termes, C ne surcharge pas correctement cette propriété. J'ai donc conclu que la solution 1 est généralement plus appropriée. – Zmaster

Questions connexes