2009-06-08 7 views
3

J'ai une classe abstraite avec une propriété abstraite définie pour avoir à la fois Get et Set. Je sais que je vais toujours vouloir obtenir cette propriété à partir de classes dérivées, mais il y a des cas où il n'a pas de sens à cette propriété dans certains types de classes dérivées.Accessibilité des propriétés abstraites

Je ne peux pas omettre l'accesseur Set dans une classe dérivée (voir l'exemple de code ci-dessous). Je pourrais remplacer l'accesseur set dans une classe dérivée pour ne rien faire avec les valeurs passées par l'utilisateur. Mais y a-t-il une autre façon de rendre la propriété dans une classe dérivée spécifique en lecture seule? En fin de compte, j'affiche ces propriétés dans une grille de propriétés et je ne veux pas que l'utilisateur entre des valeurs dans un champ qui ne fera rien. Peut-être que j'attribue simplement la propriété en lecture seule dans des classes dérivées spécifiques? En outre, je préfère vraiment ne pas jouer avec n'importe quel descripteur de type pour que les propriétés s'affichent correctement dans une grille de propriétés, par exemple en surchargeant ICustomTypeDescriptor.

public abstract class MyClass 
{ 
    public abstract string MyProperty 
    { 
     get; 
     set; 
    } 
} 

public abstract class MyDerivedClass 
{ 
    public override string MyProperty 
    { 
     //VS complains that the Set accessor is missing 
     get; 
    } 
} 
+0

Je me demandais ... Est-ce qu'une propriété est vraiment abstraite si vous définissez une méthode get/set pour cela? Ou seraient-ils des méthodes get/set abstraites? –

+0

Odd. J'ai simplement copié vos classes, ajouté un attribut hérité au second pour hériter le premier, et j'ai pu construire sans problème. –

Répondre

3

Vous ne devriez pas faire cela. Ce que vous dites en définissant votre getter et setter dans la classe abstraite est "vous devez implémenter ceci si vous voulez hériter de moi." Alors vous demandez, "comment puis-je faire une classe dérivée ignorer cette règle." La réponse est que si vous avez une situation que chaque classe dérivée a besoin d'un getter, placez-la dans la classe abstraite et laissez la classe dérivée décider si elle implémentera un setter ou non en la laissant hors de la classe abstraite. Alternativement, vous pouvez créer deux autres classes dérivées de la classe abstraite initiale, une qui implémente le setter et une autre qui ne le fait pas, et ensuite votre classe dérivée généralisera celle qui a du sens, mais c'est trop Je pense.

+2

Si vous laissez Setter hors de la classe abstraite, la classe dérivée ne pourra pas remplacer la propriété et ajouter l'accesseur. – nightcoder

+0

@nightcoder: Oui, vous avez raison, il faudrait que ce soit virutel et non abstrait. –

0

Vous devez utiliser abstract pas override:

public abstract class MyClass 
{ 
    public abstract string MyProperty 
    { 
     get; 
     set; 
    } 
} 

public abstract class MyDerivedClass 
{ 
    public abstract string MyProperty 
    { 
     get; 
    } 
} 

mais comme écrit @JP, vous ne devriez pas le faire.

0

ressemblent à la recherche de vous [ReadOnly (true)] attribut cela va montrer à la grille de la propriété de votre propriété, en lecture seule.
mais dans votre classe vous pouvez l'utiliser comme propriété habituelle (avec des possibilités de lecture et d'écriture)