82 votes

Puis-je remplacer une propriété en c #? Comment?

J'ai cette classe de base:

 abstract class Base
{
  public int x
  {
    get { throw new NotImplementedException(); }
  }
}
 

Et le descendant suivant:

 class Derived : Base
{
  public int x
  {
    get { //Actual Implementaion }
  }
}
 

Lorsque je compile, j'obtiens l'avertissement suivant: la définition de x classe Derived va masquer la version de Base de celui-ci. Est-il possible de remplacer des propriétés dans des méthodes similaires à c #?

105voto

Jeffrey Zhao Points 2200

Vous devez utiliser les mots clés virtual

 abstract class Base
{
  // use virtual keyword
  public virtual int x
  {
    get { throw new NotImplementedException(); }
  }
}
 

ou définir une méthode abstraite:

 abstract class Base
{
  // use abstract keyword
  public abstract int x { get; }
}
 

et utilisez override mot clé en tant qu'enfant:

 abstract class Derived : Base
{
  // use override keyword
  public override int x { get { ... } }
}
 

Si vous n'allez PAS remplacer, vous pouvez utiliser le mot clé new de la méthode pour masquer la définition du parent.

13voto

jrummell Points 23718

Faites en sorte que la propriété de base soit abstraite et remplacez ou utilisez le nouveau mot-clé dans la classe dérivée.

 abstract class Base
{
  public abstract int x { get; }
}

class Derived : Base
{
  public override int x
  {
    get { //Actual Implementaion }
  }
}
 

Ou

 abstract class Base
{
  public int x { get; }
}

class Derived : Base
{
  public new int x
  {
    get { //Actual Implementaion }
  }
}
 

6voto

sll Points 30638

Changer la propriété de la signature comme indiqué ci-dessous:

Classe de Base

public virtual int x 
{ get { /* throw here*/ } }

La classe dérivée

public override int x 
{ get { /*overriden logic*/ } }

Si vous n'avez pas besoin d'aucune mise en œuvre dans la classe de Base suffit d'utiliser résumé de la propriété.

Base:

public abstract int x { get; }

Dérivés:

public override int x { ... }

Je vous suggère d'utiliser abstract propriété plutôt que de trhowing NotImplemented exception dans les getter, abstact modificateur de force toutes les classes dérivées pour mettre en œuvre cette propriété de sorte que vous aurez au moment de la compilation solution sûre.

3voto

MattWritesCode Points 2204
abstract class Base 
{ 
  // use abstract keyword 
  public virtual int x 
  { 
    get { throw new NotImplementedException(); } 
  } 
} 

3voto

Felice Pollano Points 20105
 abstract class Base
{

  public virtual int x
  {
    get { throw new NotImplementedException(); }
  }
}
 

ou

 abstract class Base
{
  // use abstract keyword
  public abstract int x
  {
    get;
  }
}
 

Dans les deux cas, vous devez écrire dans la classe dérivée

 public override int x
  {
    get { your code here... }
  }
 

La différence entre les deux est que, avec abstract, vous forcez la classe dérivée à implémenter quelque chose, et avec virtaul, vous pouvez fournir un comportement par défaut que le dérivateur peut utiliser tel quel ou modifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X