2009-11-20 5 views
0

donc avec cette classe j'aiC# hérité d'initialisation de la classe

public class Options 
    { 
     public bool show { get; set; } 
     public int lineWidth { get; set; } 
     public bool fill { get; set; } 
     public Color fillColour { get; set; } 
     public string options { get; set; } 

     public virtual void createOptions() 
     { 
      options += "show: " + show.ToString().ToLower(); 
      options += ", lineWidth: " + lineWidth; 
      options += ", fill: " + fill.ToString().ToLower(); 
      options += ", fillColor: " + (fillColour != Color.Empty ? ColourToHex(fillColour) : "null"); 
     } 

     public Options(bool _show, int _lineWidth, bool _fill, Color _fillColour) 
     { 
      show = _show; 
      lineWidth = _lineWidth; 
      fill = _fill; 
      fillColour = _fillColour; 

      createOptions(); 
     } 
} 

et une autre classe qui hérite

public class Line : Options 
    { 
     public static bool steps { get; set; } 

     public override void createOptions() 
     { 
      options += ", lines: {"; 
      options += " steps: " + steps.ToString().ToLower() + ","; 
      base.createOptions(); 
      options += "}"; 
     } 

     public Line(bool _show, int _lineWidth, bool _fill, Color _fillColour, bool _steps) 
      : base(_show, _lineWidth, _fill, _fillColour) { steps = _steps; } 
    } 

Lorsque vous appelez l'objet Line(true, 1, true, Color.Gray, true) il fait la substitution de la fonction de classe héritée, puis définit steps à true.

Je veux steps à inclure dans la commande prioritaire si steps va maintenant être true au lieu de false (sa valeur par défaut).

Si cela est possible, donnez-moi quelques conseils et astuces sur la façon de résoudre ce problème et expliquez-moi pourquoi mon installation ne permettra pas que le remplacement se produise après le constructeur init.

+0

Ce code ne compile pas. Vous appelez 'createTypeOptions' depuis createOptions mais la base n'a pas de fonction, et la base n'a pas de constructeur qui prend 4 paramètres. –

+0

désolé createTypeOptions devrait être createOptions lorsque je copiais le code à stackoverflow je dois avoir manqué cela. ainsi a oublié le constructeur d'options – Ayo

+0

y at-il une raison pour avoir des étapes aussi statiques? –

Répondre

0

Je suppose que vous avez oublié de nous montrer le constructeur de classe Options, mais je suppose qu'il appelle la méthode createOptions().

En C#, vous ne pouvez pas appeler un constructeur de base où vous voulez. Le constructeur de base est toujours appelé avant le démarrage du constructeur donné. Vous pouvez consulter cette URL pour en savoir plus sur l'enchaînement constructeur:

http://www.yoda.arachsys.com/csharp/constructors.html

Mais vous pouvez obtenir ce que vous voulez en changeant votre architecture un peu. Comme je vois ceci, votre propriété options est un ToString() de la classe Options. Vous n'avez pas besoin que cette propriété soit prête au moment du constructeur.

Certaines options:

  1. Convertir la classe Options pour chaîne dans les options accesseur get.
  2. Éliminer les options propriété et, au contraire, mettre en œuvre une méthode toString qui appellerait CreateOptions ou tout simplement son contenu
+0

lien impressionnant m'a vraiment aidé j'ai changé le public bool statique pour ne pas être statique, il n'a pas besoin d'être. J'ai à peu près appelé la fonction override à l'intérieur de mon constructeur de classe hérité et cela corrigé mon problème j'ai remarqué qu'il était appelé dans ma classe de base j'ai oublié de poster cette partie dans mon exemple ci-dessus. – Ayo

0

Je ne vois pas le constructeur de la classe d'options dans le code, mais je suppose que ce premier copie les quatre paramètres donnés dans les champs correspondants, puis appelle createOptions pour initialiser le champ d'options. C'est en fait un très bon exemple de pourquoi il est mauvais d'appeler des méthodes virtuelles dans le constructeur. Il n'existe aucun moyen de définir un champ de la classe dérivée jusqu'à ce que le constructeur de la classe de base soit terminé, de sorte que la méthode substituée utilisera la valeur par défaut du champ steps.

Il existe plusieurs façons de résoudre ce problème, mais la première chose à faire est d'éviter d'appeler des méthodes virtuelles dans le constructeur. La façon dont je ferais cela est de rendre la propriété options en lecture seule et rendre son getter virtuel, de sorte qu'il calcule la valeur quand elle est nécessaire.

Modifier. Je n'ai pas remarqué que les étapes sont statiques. Ensuite, je ne comprends pas pourquoi le définir dans le constructeur de l'instance.

0

Voici quelques conseils lorsque vous travaillez avec les membres statiques de classe comme public static bool steps:

  1. membres statiques sont initialisés à leurs valeurs par défaut (faux dans ce cas) lorsque la classe est chargée pour la première fois.N'oubliez pas que les membres statiques appartiennent à la classe et non à l'instance, de sorte qu'ils ne peuvent pas être remplacés, mais peuvent être masqués dans les classes dérivées en utilisant le mot-clé new. Vous pouvez utiliser un constructeur spécial appelé constructeur statique pour initialiser explicitement les membres de classe statiques ... vous ne devriez donc pas essayer de les initialiser dans un constructeur d'instance comme l'illustre votre extrait de code.

Une recherche rapide sur Google C# membres statiques peuvent être utiles: Link to C# Help on Static Members

Questions connexes