web-dev-qa-db-fra.com

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, je reçois cet avertissement disant que la définition de x par la classe Derived masquera la version de Base de celui-ci. Est-il possible de remplacer des propriétés dans des méthodes similaires à c #?

66
atoMerz

Vous devez utiliser le mot clé virtual

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

ou définir une propriété abstraite:

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

et utilisez le mot clé override lorsque vous êtes dans l'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.

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

Rendre la propriété de base abstraite et remplacer ou utiliser 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 }
  }
}
11
jrummell

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

classe de base

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

classe dérivée

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

Si vous n'avez besoin d'aucune implémentation dans la classe de base, utilisez simplement la propriété abstract.

Base:

public abstract int x { get; }

dérivé:

public override int x { ... }

Je vous suggèrerais d'utiliser la propriété abstract plutôt que de passer à l'exception de NotImplemented dans le getter. Le modificateur abstact forcera toutes les classes dérivées à implémenter cette propriété afin que vous obteniez une solution sécurisée au moment de la compilation.

4
sll
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.

3
Felice Pollano
abstract class Base 
{ 
  // use abstract keyword 
  public virtual int x 
  { 
    get { throw new NotImplementedException(); } 
  } 
} 
3
Matt Seymour