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 :

Interfaces et static


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de istace.emmanuel
    Homme Profil pro
    Senior Full-Stack .Net Developer
    Inscrit en
    Août 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Full-Stack .Net Developer
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2009
    Messages : 125
    Par défaut Interfaces et static
    Bonjour a tous,

    J'ai un petit soucis, j'ai une série de classe que j'utilise au travers de l'interface implémenté. Mais je voudrais pouvoir récupéré un attribut const propre a la l'implémentation de l'interface sans instancier d'objet.

    Je pensais mettre un attribut static mais ça n'a pas l'air possible. Quelqu'un aurait une solution ?

    Merci d'avance
    Istace Emmanuel

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    En mettant uniquement une propriété get dans l'interface car tu ne peux pas mettre du static dans une interface car le polymorphisme ne s'applique pas sur les attributs static

    Code : 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
     
    interface IToto
    	{		 
    		  string MyConstant
    		  {
    		  	get ;
    		  }
    	}
     
    class Toto : IToto
    	{
     
    		public string MyConstant
    		  {
    			get { return"toto";}
    		  }
    	}
     
    	class Tata : IToto
    	{
    		public string MyConstant
    		  {
    			get { return"tata";}
    		  }
    	}

  3. #3
    Membre confirmé Avatar de istace.emmanuel
    Homme Profil pro
    Senior Full-Stack .Net Developer
    Inscrit en
    Août 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Full-Stack .Net Developer
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2009
    Messages : 125
    Par défaut
    Mais dans ce cas la je devrai tout de même instancier un objet. Sinon quand j'ai le System.Type de la classe d'implémentation que je cast dans le type de mon interface pour accéder a l'attribut j'obtiens un erreur de cast.

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Pourquoi tu as besoin de faire cela ?

    Il faut instancier un objet pour bénéficier du polymorphisme sinon il te faut mettre du static dans toutes tes classes et ne pas passer par une interface mais une class abstract

    Dans tous les cas avec system.type tu ne pourras pas faire grand chose dans ce cas de figure..

  5. #5
    Membre confirmé Avatar de istace.emmanuel
    Homme Profil pro
    Senior Full-Stack .Net Developer
    Inscrit en
    Août 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Full-Stack .Net Developer
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2009
    Messages : 125
    Par défaut
    En fait c'est un système de plug in. J'utilise donc naturellement une interface pour cela. J'ai une sorte de ServiceLocator mais qui n'est pas un IDictionary<object, object> avec interface/implémentation mais un IDictionary<string, Type> avec le nom comme clef et le Type et des Lazy initialization. Je ne veux pas instancier un plugin tant qu'il n'est pas utilisé car je ne sais pas combien il y en aura et leurs besoin. Et j'aurais besoin de récupérer des sorte de metadata comme le nom,description,auteur,etc,... d'ou ma tentative de string en static via l'interface.
    Je pense que je vais passer par des descripteurs xml pour les plugins a la place de l'attribut.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par istace.emmanuel Voir le message
    En fait c'est un système de plug in. J'utilise donc naturellement une interface pour cela.
    "naturellement" ben oui et non ....

    Pour faire des plugin en .Net, le plus propre est de définir :

    - L'interface de PlugIn (comme tu l'as fait).
    - Un jeu de "custom attributes" descriptif pour le Plugin qui vont remplacer avantageusement les static que tu ne peux pas utiliser et constituer tes métadonnése descriptives.

    Exemple basique :

    Code : 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
    static void Main(string[] args)
    {
    	Func<Type, bool> PluginTypeSelector = t => (t.GetCustomAttributes(typeof(PluginAttribute), false).FirstOrDefault() != default(Type));
    	var pluginTypes = Assembly.GetExecutingAssembly().
    			GetTypes().
    			Where(PluginTypeSelector);
     
    	/* on liste et instancie les plugin */
    	foreach (Type pluginType in pluginTypes)
    	{
    		PluginAttribute pluginAttr = (PluginAttribute)pluginType.GetCustomAttributes(typeof(PluginAttribute), false).First();
    		string pluginName = pluginAttr.PluginName;
    		// on vérifioe la validité du plugin => implémente-t-il l'interface ?
    		if(typeof(IPlugin).IsAssignableFrom(pluginType) == false)
    		{
    			Console.WriteLine(pluginName + " est invalide !!!");
    			continue;
    		}
    		Console.WriteLine("Instanciation Plugin : {0} ", pluginName); ;
    		IPlugin aPLugin = (IPlugin) Activator.CreateInstance(pluginType);
     
    		Console.WriteLine("Appel Plugin : {0} résultat {1} ", pluginName, aPLugin.SampleMethod()); ;
    	}
    }
     
    public interface IPlugin
    {
    	int SampleMethod();
    }
     
    [Plugin("Mon Plugin")]
    public class MyPlugin : IPlugin
    {
     
    	public int SampleMethod()
    	{
    		return 42;
    	}
    }
     
    [Plugin("Mon Autre Plugin")]
    public class MyPlugin2 : IPlugin
    {
     
    	public int SampleMethod()
    	{
    		return 9999;
    	}
    }
     
    [AttributeUsage(AttributeTargets.Class)]
    public class PluginAttribute : Attribute
    {
    	public readonly string PluginName;
    	public PluginAttribute(string pluginName)
    	{
    		PluginName = pluginName;
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [c#] Interfaces + static
    Par Leole dans le forum C#
    Réponses: 7
    Dernier message: 11/06/2008, 14h45
  2. [Interface] méthodes static
    Par JMLLB dans le forum Langage
    Réponses: 11
    Dernier message: 13/04/2007, 16h18
  3. Réponses: 16
    Dernier message: 26/10/2006, 16h17
  4. methode static interface
    Par samtheh dans le forum Langage
    Réponses: 3
    Dernier message: 15/10/2006, 19h25
  5. Réponses: 6
    Dernier message: 27/07/2005, 09h06

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