IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Classe avec membre par défaut


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut Classe avec membre par défaut
    Bonjour,

    Sous VBA il est possible de définir un membre par défault, si je définis la classe clsString comme suivant :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private m_str As string
     
    'default member
    Public Property Get value() As String
    Attribute value.VB_Description = "Default member."
    Attribute value.VB_UserMemId = 0
     
        value = m_str
     
    End Property
     
    '
    Public Sub method()
     
    End Sub

    Je peux par exemple écrire (cela revient en quelque sorte à enrichir un type de base).

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim str As New clsString: str = "Test" ' Conversion implicite d'une chaine de caractère en object via le membre par défaut
     
    str.method

    Y-a-t'il quelque chose d'équivalent en C# 8.0, peut-être via des attributs comme en VBA ou en redéfinant l'opérateur d'affectation (?) = ?

    En fait, je cherche à enrichir une enumération par un object ou plus exactement à accèder aux objects via une énumération.

    Merci par avance !

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    En C# toutes propriété (un membre public avec un accesseur get) peut être initialisée en la plaçant entre des accolades.

    L'équivalent de ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class clsString
    {
        public string Value { get; set; }
        public string Description { get; set; }
        public int UserMemoryId { get; set; }
     
        public clsString()
        {
            Description = "Default member.";
            UserMemoryId = 0;
        }
     
        public Method() {}
    }
    L'équivalent de ton appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var str = new clsString { Value = "Test" };

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    Merci, mais je ne pense pas que ça corresponde vraiment à un "membre par défaut".

    En effet, il n'est pas possible d'écrire str = "Other test" à la place de str.Value = "Other test" (ce qui n'est à vrai dire pas plus mal).

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 568
    Par défaut
    Bonjour,
    Je ne comprends pas bien la question !

    Pour initialiser des valeurs par défaut il est toujours possible de surcharger le constructeur.
    Dim str As New clsString("Test")

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 427
    Par défaut
    Bonjour,
    D'après ce que je comprends, tu veux que l'affectation d'une chaine à ton instance "provoque" l'affectation de la dite chaine à un membre de la classe.
    Ce qui reviendrait à surcharger l'opérateur d'affectation.

    D'après ce que j'ai trouvé dans l'aide en ligne, ce n'est pas possible.

    Par contre tu peux surcharger l'opérateur de conversion.
    A vérifier, mais je pense que si tu surcharges l'opérateur de conversion depuis/ver une chaine, tu devrais avoir ce que tu cherches.
    Enfin si j'ai bien compris la demande.

    Ensuite tu parles d'enrichir une énumération. Tu peux tout à fait créer un indexeur, et gérer l'accès au membre de ton énumération.

    Reste à voir si ces deux éléments correspondent à ce que tu cherches.

    Tatayo.

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Voici ce que tu peux faire par exemple :

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    using System;
    using System.Collections.Generic;
     
    namespace SandBox
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Personne> personnes = new List<Personne>();
     
                personnes.Add(new Personne());
                personnes.Add(new Personne() { Nom = "Jean", Prenom = "Dupont" });
                personnes.Add(new Personne() { NomComplet = "Jean Dupuis" });
                personnes.Add("Jean Dulac"); // On aurait aussi pu écrire Personne p = "Jean Dulac";
                personnes.Add("Jean");
                personnes.Add(string.Empty);
     
                foreach(Personne p in personnes)
                {
                    Console.WriteLine(p);
                }
            }
        }
     
        class Personne
        {
            public string Nom { get; set; } = string.Empty;
            public string Prenom { get; set; } = string.Empty;
     
            public string NomComplet
            {
                get
                {
                    return $"{Prenom} {Nom}".Trim();
                }
                set
                {
                    string[] parts = value.Split(' ');
                    Nom = parts[0];
                    if (parts.Length > 1)
                    {
                        Prenom = parts[1];
                    }
                    else
                    {
                        Prenom = string.Empty;
                    }
                }
            }
     
            /* Inutile de déclarer un constructeur */
     
            public override string ToString()
            {
                return $"Personne: {{Nom: {Nom}, Prenom:{Prenom}}}";
            }
     
            public static implicit operator Personne(string nomComplet)
            {
                return new Personne() { NomComplet = nomComplet };
            }
        }
    }

    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Personne: {Nom: , Prenom:}
    Personne: {Nom: Jean, Prenom:Dupont}
    Personne: {Nom: Jean, Prenom:Dupuis}
    Personne: {Nom: Jean, Prenom:Dulac}
    Personne: {Nom: Jean, Prenom:}
    Personne: {Nom: , Prenom:}

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/10/2012, 19h25
  2. Envoyer un mail avec client par défaut
    Par cryborg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 13/11/2007, 22h16
  3. Pas d'écran : Live CD avec SSH par défaut ?
    Par adrien357 dans le forum Distributions
    Réponses: 2
    Dernier message: 21/06/2007, 14h13
  4. Réponses: 2
    Dernier message: 12/04/2007, 14h14
  5. Supprimer une colonne avec valeurs par défaut
    Par SlashOwnsU dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/09/2006, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo