Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

16 réponses
Avatar
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

10 réponses

1 2
Avatar
Jérémy Jeanson
On 27 jan, 16:13, "Christian Hubert-Hugoud / weabow - Xtrem7 -
Groobax" wrote:
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();
}
}
}
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
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
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
J'ai trouvé : il faut rester au même niveau logique.
Avatar
Jérémy Jeanson
Bonjour Christian,

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

Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
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
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
les classes static ne peuvent implémenter d'interface... dit le compilateur

Soit.


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax" a
é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



Avatar
Jérémy Jeanson
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
Avatar
Jérémy Jeanson
Oui, c'est normal.

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

Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
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" a écrit dans le message de
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
Avatar
Christophe Lephay
"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax" a
é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é.
1 2