J'ai une classe de base abstraite et je souhaite déclarer un champ ou une propriété qui aura une valeur différente dans chaque classe qui hérite de cette classe parente.
Je veux le définir dans la classe de base afin de pouvoir le référencer dans une méthode de classe de base - par exemple en remplaçant ToString pour dire "Cet objet est de type propriété / champ ". J'ai trois façons dont je peux voir de faire cela, mais je me demandais - quelle est la meilleure façon acceptée de faire cela? Question de débutant, désolé.
Option 1:
utilisez une propriété abstraite et remplacez-la sur les classes héritées. Cela bénéficie d'être appliqué (vous devez le remplacer) et c'est propre. Mais, il semble légèrement faux de renvoyer une valeur de code en dur plutôt que d'encapsuler un champ et il s'agit de quelques lignes de code au lieu de juste. Je dois aussi déclarer un corps pour "set" mais c'est moins important (et il y a probablement un moyen d'éviter ce que je ne connais pas).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Option 2
Je peux déclarer un champ public (ou un champ protégé) et le remplacer explicitement dans la classe héritée. L'exemple ci-dessous me donnera un avertissement pour utiliser "nouveau" et je peux probablement le faire, mais cela ne semble pas bien et cela brise le polymorphisme, ce qui était le point essentiel. Cela ne semble pas être une bonne idée ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Option 3
Je peux utiliser un champ protégé et définir la valeur dans le constructeur. Cela semble assez ordonné mais dépend de moi pour que le constructeur définisse toujours cela et avec plusieurs constructeurs surchargés, il y a toujours une chance qu'un chemin de code ne définisse pas la valeur.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
C'est un peu une question théorique et je suppose que la réponse doit être l'option 1 car c'est la seule option sûre , mais je me suis juste familiarisé avec C # et je voulais poser cette question à des personnes ayant plus d'expérience.