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 #?
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 { ... } }
}
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 }
}
}
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.
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.
abstract class Base
{
// use abstract keyword
public virtual int x
{
get { throw new NotImplementedException(); }
}
}