2009-02-13 4 views
4

Est-il possible de faire quelque chose comme ça?Est-il possible d'ajouter un accesseur à une propriété dans .NET en le remplaçant?

class A 
{ 
    public virtual string prop 
    { 
     get 
     { 
      return "A"; 
     } 
    } 
} 
class B: A 
{ 
    private string X; 
    public override string prop 
    { 
     get 
     { 
      return X; 
     } 
     set 
     { 
      X = value; 
     } 
    } 
} 

C'est, la classe de base fournit une propriété virtuelle avec seulement un accesseur GET, mais la classe enfant l'emporte sur l'EEG et fournit également un ensemble.

L'exemple actuel ne compile pas, mais il me manque peut-être quelque chose ici.

Ajouté: Pour clarifier, non je ne veux pas redéfinir avec de nouveaux. Je veux ajouter un nouvel accesseur. Je sais que ce n'était pas dans la classe de base, donc cela ne peut pas être annulé. OK, laissez-moi essayer d'expliquer à quoi cela ressemblerait sans le sucre syntaxique:

class A 
{ 
    public virtual string get_prop() 
    { 
      return "A"; 
    } 
} 
class B: A 
{ 
    private string X; 
    public override string get_prop() 
    { 
     return X; 
    } 
    public virtual string set_prop() 
    { 
     X = value; 
    } 
} 
+0

Re l'édition - la réponse simple est non: vous ne pouvez pas. –

+0

Modifiez ceci dans votre réponse et je l'accepterai. :) –

Répondre

1

Non, ce n'est pas possible. Malheureusement, vous ne pouvez même pas remplacer et modifier le niveau d'accès (de protégé à public par exemple), comme documenté sur MSDN. Je recommande que vous envisagiez de restructurer légèrement le code/classe et que vous cherchiez un autre moyen d'accomplir cette tâche, par exemple déclarer l'accesseur set avec le modificateur protected en utilisant une méthode SetProperty dans la classe dérivée.

1

Non, il n'y a aucun moyen de le faire. Pensez à la façon dont le sucre syntaxique de votre propriété virtuelle est traitée, à savoir qu'il est converti en:

public virtual string get_prop(); 

Il n'y a pas de méthode de set_Prop pour passer outre, et vous ne pouvez pas remplacer une méthode qui n'existe pas.

+0

True, mais je peux ajouter une nouvelle méthode virtuelle, non? –

+0

pas sûr de ce que vous voulez dire, mais vous pouvez ajouter une méthode virtuelle en tant que propriété 'set' qui sera convertie en une méthode de jeu virtuel ... – ng5000

0

Vous pouvez masquer l'implémentation de la classe de base en utilisant le mot-clé 'new' dans votre classe dérivée. Les éléments suivants doivent être compilés avec succès:

class A 
{ 
    public virtual string prop 
    { 
     get 
     { 
      return "A"; 
     } 
    } 
} 
class B : A 
{ 
    private string X; 
    public new string prop 
    { 
     get 
     { 
      return X; 
     } 
     set 
     { 
      X = value; 
     } 
    } 
} 
+0

L'introduction d'un champ de support différent est généralement risquée, bien que ... perspective de boîte, classe A pourrait avoir un champ etc comme l'implémentation sous-jacente, et toute utilisation de ce champ serait suspect ... –

+0

D'accord, je ne suis pas friand de ce code ... –

0

L'introduction d'un nouveau champ sent le désordre. Et de toute façon vous devez faire attention à ne pas casser le polymorphisme et l'héritage (et si la classe de base parle au domaine privé?). En ce qui concerne l'ajout d'un nouvel accesseur lors du dépassement; la réponse simple est "non, vous ne pouvez pas". Lorsque vous surchargez, vous ne pouvez affecter que les accesseurs existants, puisque c'est ce qui est défini dans la table virtuelle pour le membre (un membre surchargé est toujours "possédé" par la classe de base/déclarante, pas par la classe de remplacement).

Une option (pas idéale) est de re-déclarer la propriété, mais vous aurez toujours besoin d'un moyen de parler à la classe de base. Donc, si l'accesseur dans la classe de base était protected:

class A 
{ 
    public string prop 
    { 
     get; 
     protected set; 
    } 
} 
class B : A 
{ 
    public new string prop 
    { 
     get { return base.prop; } 
     set { base.prop = value; } 
    } 
} 
Questions connexes