J'ai une classe de base abstraite et je veux déclarer un champ ou une propriété qui aura une valeur différente dans chaque classe qui hérite de cette classe mère.
Je veux le définir dans la classe de base afin de pouvoir y faire référence dans une méthode de la classe de base - par exemple en surchargeant ToString pour dire "Cet objet est du type propriété/champ ". Je vois trois façons de procéder, mais je me demandais : quelle est la meilleure façon de procéder ? Question de débutant, désolé.
Option 1 :
Utiliser une propriété abstraite et la surcharger sur les classes héritées. Cette méthode a l'avantage d'être appliquée (vous devez la surcharger) et elle est propre. Mais, cela semble légèrement incorrect de retourner une valeur codée en dur plutôt que d'encapsuler un champ et cela représente quelques lignes de code au lieu d'une seule. Je dois également déclarer un corps pour "set" mais c'est moins important (et il existe probablement un moyen d'éviter cela dont je n'ai pas connaissance).
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 surcharger explicitement dans la classe héritée. L'exemple ci-dessous me donnera un avertissement pour utiliser "new" et je peux probablement le faire, mais cela semble faux et cela brise le polymorphisme, qui était le point principal. 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 simple, mais je dois m'assurer que le constructeur définit toujours cette valeur 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 une question un peu théorique et je pense que la réponse doit être l'option 1, car c'est la seule sûr mais je commence tout juste à me familiariser avec le C# et je voulais poser cette question à des personnes plus expérimentées.
0 votes
Abstract public int MyInt { get ; set;} => public abstract string IntentName { get ; set;} :D
3 votes
@Camo Il n'est pas approprié d'éditer les titres comme vous le faites. Les tags sont là pour accomplir cela.
0 votes
La langue doit figurer dans le titre. Personne n'a le temps de chercher et de lire des petits tags quelque part à la fin de la question alors qu'il faut chercher des tonnes de résultats. Merci de votre compréhension
0 votes
Si la langue figurait dans le titre, elle ne serait pas dans le résultat de ma recherche pour Java. J'espère que ces raisons ont un sens.
3 votes
Et pourtant, votre opinion personnelle sur la question est en stricte opposition avec la politique du site en la matière. Ce n'est pas parce que vous voulez que tout le monde mette ses tags dans le titre que c'est approprié. Les tags sont pris en compte lors des recherches, pas seulement les titres. J'espère que ces raisons sont compréhensibles et merci de votre compréhension pour ne pas violer les règles du site à l'avenir.
0 votes
Peut-être que la politique est mauvaise. Qu'est-ce qui n'a pas de sens dans mes commentaires ? Il ne s'agit pas d'opinions, mais de la vérité.
2 votes
Si vous voulez que la politique soit changée, proposez qu'elle soit changée, ne vous promenez pas en modifiant les questions de manière inappropriée. Il existe de nombreuses et longues discussions sur le sujet, que vous êtes libre de lire si vous êtes intéressé par les explications de la politique actuelle, et avec lesquelles vous devriez absolument vous familiariser avant de proposer de la changer.
0 votes
Il n'y a qu'une seule vérité. La vérité est que cette question C# est dans mon résultat Java. Je n'ai jamais lu les balises. Cela peut être utile pour le moteur de recherche mais pas pour les humains.