Débutant : pb de classe public et d'interface

Le
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Bonjour,

J'ai une appli qui utilise une dll. Depuis cette appli, je souhaite utiliser
des Interfaces pour créer des objets, fournis par la dll.

Cela fonctionne tant que la classe qui hérite de l'Interface est publique
(dans la dll).

Or, si cette classe est publique, je peux instancier directement un objet en
utilisant la classe, et non pas l'Interface.

Or je souhaite que les utilisateurs qui utilisent la dll n'aient pas accès à
la classe elle-même. Je voudrais que la classe soit cachée.

Est-ce possible ?

Voici le code :

La classe qui est dans la dll :
namespace Xtrem7Engine
{
public class X7login : IX7login
{
public string GetFullVersion()
{
return "Coucou";
}
}
}

L'interface de cette classe (dans la dll aussi) :
namespace Xtrem7Engine
{
public interface IX7login
{
string GetFullVersion();
}
}

L'appel depuis l'appli :
private void button1_Click(object sender, RoutedEventArgs e)
{
Xtrem7Engine.IX7login Login;
Login = new Xtrem7Engine.IX7login();

MessageBox.Show(Login.GetFullVersion());

}

or on peut aussi très bien faire :
private void button1_Click(object sender, RoutedEventArgs e)
{
Xtrem7Engine.X7login Login;
Login = new Xtrem7Engine.X7login();

MessageBox.Show(Login.GetFullVersion());

}
Dans ce second cas, on utilise la classe directement.

Merci de votre aide

Christian
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jérémy Jeanson
Le #21063411
On 27 jan, 16:13, "Christian Hubert-Hugoud / weabow - Xtrem7 -
Groobax"
Bonjour,

J'ai une appli qui utilise une dll. Depuis cette appli, je souhaite utili ser
des Interfaces pour créer des objets, fournis par la dll.

Cela fonctionne tant que la classe qui hérite de l'Interface est publiq ue
(dans la dll).

Or, si cette classe est publique, je peux instancier directement un objet en
utilisant la classe, et non pas l'Interface.

Or je souhaite que les utilisateurs qui utilisent la dll n'aient pas acc ès à
la classe elle-même. Je voudrais que la classe soit cachée.

Est-ce possible ?

Voici le code :

La classe qui est dans la dll :
namespace Xtrem7Engine
{
    public class X7login : IX7login
    {
        public string GetFullVersion()
        {
            return "Coucou";
        }
    }

}

L'interface de cette classe (dans la dll aussi) :
namespace Xtrem7Engine
{
    public interface IX7login
    {
        string GetFullVersion();
    }

}

L'appel depuis l'appli :
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Xtrem7Engine.IX7login Login;
            Login = new Xtrem7Engine.IX7login();

            MessageBox.Show(Login.GetFullVersion());

       }

or on peut aussi très bien faire :
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Xtrem7Engine.X7login Login;
            Login = new Xtrem7Engine.X7login();

            MessageBox.Show(Login.GetFullVersion());

       }
Dans ce second cas, on utilise la classe directement.

Merci de votre aide

Christian



Bonjour Christian,

La solution la plus simple consiste à faire une fabrique qui serra
dans ta dll et la rendre public. Tes classe implémentant leurs
interface pourront alors être privées.

Ex :
namespace Xtrem7Engine
{
public static class MaFabrique
{
public static IX7login GetNewX7login()
{
return new X7login();
}
}
}
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Le #21064261
Merci de ta réponse. J'ai implémenté tes sources et cela fonctionne très
bien.

Par contre (je rame), j'ai un pb avec ce code :

la fabrique :
namespace Xtrem7Engine
{
public static class X7
{
public static Ilogin GetNewlogin()
{
return new login();
}
public static string GetFullVersion( login curlogin) // c'est ici
que j'ai ajouté du code
{
return curlogin.GetFullVersion();
}
}
}

la classe :
namespace Xtrem7Engine
{
class login : Ilogin
{
string GetFullVersion()
{
return "Coucou";
}
}
}

l'interface de la classe :
namespace Xtrem7Engine
{
public interface Ilogin
{
string GetFullVersion();
}
}

Lors de la compilation, je récupère :

Error 1 Inconsistent accessibility: parameter type 'Xtrem7Engine.login' is
less accessible than method
'Xtrem7Engine.X7.GetFullVersion(Xtrem7Engine.login)


Je comprends vaguement le sens, mais je ne vois pas du tout ni pourquoi, ni
comment résoudre le pb.

As-tu une idée ?

Christian
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Le #21065171
J'ai trouvé : il faut rester au même niveau logique.
Jérémy Jeanson
Le #21069151
Bonjour Christian,

Et bien voila, tu as tout compris
-> public static string GetFullVersion( Ilogin curlogin) {}

Jérémy JEANSON
MCP
http://www.jjeanson.fr
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Le #21069141
Encore mieux !

Maintenant, j'ai essayé de mettre une Interface sur cette classe (bien que
je ne sois pas convaincu de la pleine utilité de la chose). Je n'arrive pas
à l'utiliser depuis le code. As-tu une idée ?


La fabrique :
namespace Xtrem7Engine
{
public abstract class X7 : IX7
{
public Ilogin GetNewlogin()
{
return new login();
}
public Itruc GetNewTruc()
{
return new truc();
}
public static string GetFullVersion()
{
return "Ma version";
}
}
}

L'Interface de la fabrique :
namespace Xtrem7Engine
{
public interface IX7
{
Ilogin GetNewlogin();
Itruc GetNewTruc();
}
}

L'appel :
MessageBox.Show(IX7.GetNewTruc()....);

L'erreur :
Error 1 An object reference is required for the non-static field, method, or
property 'Xtrem7Engine.IX7.GetNewTruc()

Christian
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Le #21069681
les classes static ne peuvent implémenter d'interface... dit le compilateur

Soit.


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax" écrit dans le message de news:u0037m$
Encore mieux !

Maintenant, j'ai essayé de mettre une Interface sur cette classe (bien que
je ne sois pas convaincu de la pleine utilité de la chose). Je n'arrive
pas à l'utiliser depuis le code. As-tu une idée ?


La fabrique :
namespace Xtrem7Engine
{
public abstract class X7 : IX7
{
public Ilogin GetNewlogin()
{
return new login();
}
public Itruc GetNewTruc()
{
return new truc();
}
public static string GetFullVersion()
{
return "Ma version";
}
}
}

L'Interface de la fabrique :
namespace Xtrem7Engine
{
public interface IX7
{
Ilogin GetNewlogin();
Itruc GetNewTruc();
}
}

L'appel :
MessageBox.Show(IX7.GetNewTruc()....);

L'erreur :
Error 1 An object reference is required for the non-static field, method,
or property 'Xtrem7Engine.IX7.GetNewTruc()

Christian



Jérémy Jeanson
Le #21069911
Si j'ai bien compris tu utilise une interface directement?

Attention il ne faut pas confondre interface et classe static. Pur
manipuler une interface il faut une instance d'une classe qui
implémente l'interface.

Jérémy JEANSON
MCP
http://www.jjeanson.fr
Jérémy Jeanson
Le #21069901
Oui, c'est normal.

Mais pourquoi voudrais tu utiliser une interface et une classe static?

Jérémy JEANSON
MCP
http://www.jjeanson.fr
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Le #21070101
Je n'ai pas d'intention, si ce n'est de comprendre comment cela fonctionne.
Effectivement je ne vois pas l'intérêt.

"Jérémy Jeanson" news:
Oui, c'est normal.

Mais pourquoi voudrais tu utiliser une interface et une classe static?

Jérémy JEANSON
MCP
http://www.jjeanson.fr
Christophe Lephay
Le #21095281
"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax" écrit dans le message de groupe de discussion :


Je n'ai pas d'intention, si ce n'est de comprendre comment cela
fonctionne. Effectivement je ne vois pas l'intérêt.



Pour comprendre comment cela fonctionne, ça aide de savoir à quoi ça sert.

A mon sens, une interface sert à deux choses :

- éviter les références croisées
.net ne propose pas un modèle de compilation séparée comme en C++, dans
lequel on sépare déclaration et implémentation.
De ce fait, si une classe A utilise une classe B qui, elle-même, utilise la
classe A, on ne peut pas compiler à moins de baser l'une ou l'autre (ou
préférablement les deux) sur des interfaces définies dans des assemblies
différents des deux classes A et B.

- un contrat distribué
Pour tout le monde, une interface définit un contrat. Dans le cadre d'une
infrastructure distribuée, le compilateur ne peut pas avoir accès au code ni
aux données présents sur un processus (et possiblement une machine)
différent. Si, dans l'absolu, une classe de base représente aussi un
contrat, l'interface est le contrat maximum que peut garantir le compilateur
dans un environnement distribué.
Publicité
Poster une réponse
Anonyme