[C#] Méthode par défaut

Méthode par défaut [C#] - C#/.NET managed - Programmation

Marsh Posté le 06-01-2005 à 12:09:01    

Imaginons un truc simple.
 
Je veux créer une class mettons "XMLSimpleTag", avec un constructeur prenant en paramètre le nom du tag et son contenu.
 
Ensuite, au lieu de faire un :
 
XMLSimpleTag monObj = new XMLSimpleTag("tag", "value" );
Console.Write(monObj.ToString());
 
=> "<tag>value</tag>"
 
Je veux pouvoir écrire simplement :
 
XMLSimpleTag monObj = new XMLSimpleTag("tag", "value" );
Console.Write(monObj);
 
Et obenir le même résultat.
 
Comment faire ?
 
Actuellement, j'ai fait un truc goret :
 
public string value
{
   get
   {
      return ...;
   }
}
 
Ca à l'air de compiler, mais à cause de références merdiques qui ne dépendent pas de moi, je ne peux pas aller jusqu'au bout de la compilation.

Reply

Marsh Posté le 06-01-2005 à 12:09:01   

Reply

Marsh Posté le 06-01-2005 à 12:10:02    

Ben un appel à Console.Write(monObj); fait automatiquement appel à ToString, non ? :??: a vérifier...

Reply

Marsh Posté le 06-01-2005 à 12:14:55    

Non, ça c'est parceque "ToString()" en interne est spécifié comme méthode par défaut. Et sur un objet perso, ça retourne le type de l'objet. Je sais pas si ça supporte la surcharge par contre. Mais dans tous les cas, je péfèrerais si possible avoir une propriété "à moi" par défaut, et non pas modifier celle de base du framework.


Message édité par Arjuna le 06-01-2005 à 12:15:03
Reply

Marsh Posté le 06-01-2005 à 12:16:25    

Ben si t'as juste besoin de ToString, laisse comme ça. Sinon, je sais pas si c'est possible :/ Pour une propriété c'est faisable, mais pour une méthode, je sais pas...

Reply

Marsh Posté le 06-01-2005 à 13:48:58    

Et c'est comment pour la propriété ?

Reply

Marsh Posté le 06-01-2005 à 13:54:42    

En VB c'est comme ça, mais ça doit pas trop changer en écharpe :

Code :
  1. Default Public Property pouet(ByVal index As Integer) As Integer


Note qu'il faut un paramètre pour la propriété. Une propriété par défaut en fait sera utilisée comme ça :

Code :
  1. monObj(truc)


Au lieu de :

Code :
  1. monObj.maPropriete(truc)

Reply

Marsh Posté le 09-01-2005 à 21:47:42    

ben tu surcharges le ToString de ta classe pour qu'il t'affiche ce que tu veux.

Reply

Marsh Posté le 10-01-2005 à 02:06:32    

C'est ce que j'ai fait, mais j'aurais préféré avoir un comportement comme ça :
 
XMLSimpleTag monTag;
 
monTag.tag = "toto";
monTag.value = "titi";
 
Console.Write(monTag);
 
=> "<toto>titi</toto>"
 
(avec une class héritée de String, ça aurait marché, sauf que je n'arrive pas à faire appeler par défaut ce "ToString()"
 
C'est pourtant bien le cas pour le type "int". Il ne nécessite pas de cast lorsqu'on l'appelle, preuve qu'une méthode par défaut est bien appelée, et que cette dernière à une surcharge pour un type en sortie "string". Du moins, c'est comme ça que j'interprète le fonctionnement de ce type.

Reply

Marsh Posté le 10-01-2005 à 02:10:23    

En fait, d'ailleurs, je ne sais pas pourquoi je vous ai parlé de class "XMLTag". A la base, c'est un type "SQLString" que je veux faire, qui permette d'échapper automatiquement les quotes en vue de passer les données à une requête.
 
Comme ça, toutes mes fonctions contenant des traîtements SQL seraient comme ça :
 
public void doSomething(XMLString val)
{
   string sql;
   sql = "select * from latable where champ = " + val;
}
 
=> Du coup, je ne nuit pas à la lecture avec des ' et des Replace foutus dans tous les sens.

Reply

Marsh Posté le 11-01-2005 à 16:54:51    

implicit cast peut etre :??:

Reply

Marsh Posté le 11-01-2005 à 16:54:51   

Reply

Marsh Posté le 11-01-2005 à 17:19:27    

J'ai surchargé le ToString finalement...
Ca marche pas trop mal :
 

Code :
  1. SqlDataAdapter adapter = new SqlDataAdapter("select objNum, typObj, objNam, objXml, usrCre, usrMod, usrVal, dteCre, dteMod, dteVal, dteBeg, dteEnd, objSta, objOri, typOri, objPar, typPar, objPos, objHom from objGet(" + objNum.ToString() + ", " + (new sqlString(objTyp)) + " )", cnx);


 

Code :
  1. using System;
  2. namespace Cms.Components.DataAccess
  3. {
  4. /// <summary>
  5. /// Summary description for sqlString.
  6. /// </summary>
  7. public class sqlString
  8. {
  9.  private string Value;
  10.  public sqlString()
  11.  {
  12.  }
  13.  public sqlString(string initValue)
  14.  {
  15.   this.Value = initValue;
  16.  }
  17.  public override string ToString()
  18.  {
  19.   if (this.Value != null)
  20.    return "'" + this.Value.Replace("'", "''" ).Replace("%", "%%" ) + "'";
  21.   else
  22.    return "null";
  23.  }
  24. }
  25. public class sqlBool
  26. {
  27.  private string Value;
  28.  public sqlBool()
  29.  {
  30.  }
  31.  public sqlBool(string initValue)
  32.  {
  33.   this.Value = initValue;
  34.  }
  35.  public override string ToString()
  36.  {
  37.   if (this.Value == null)
  38.   {
  39.    return "null";
  40.   }
  41.   else if (this.Value == "False" )
  42.   {
  43.    return "0";
  44.   }
  45.   else
  46.   {
  47.    return "1";
  48.   }
  49.  }
  50. }
  51. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed