Utilisateur anonyme
-
17 déc. 2007 à 11:42
Utilisateur anonyme -
12 juin 2008 à 15:15
Salut les codeurs !
je veux passer a la version 2 de mon crypteur Xblue (voir la source Xblue sur delphi-fr). Dans cette version 2 je souhaite améliorer le code source de la façon suivante : OBJET ! :)
Un probléme ce pose, je crée l'interface suivante (je simplifie un peux le code):
// Interface Icrypteur
public interface Icrypteur
{
public int crypte(...);
public int decrypte(...);
}
Ensuite, je crée différente classe (autant que je souhaite avoir de cryptage différent: xor, rsa, etc):
// classe crypteur xor
public classe crypt_xor : Icrypteur
{
public int crypte(...);
public int decrypte(...);
...
}
// classe crypteur rsa
public classe crypt_rsa : Icrypteur
{
public int crypte(...);
public int decrypte(...);
...
}
...
Icrypteur crypteur;
// ici je peux crée différent crypteur, grace a l'interface
Icrypteur = new crypt_xor();
Concrétement, l'erreur qui me chagrine, et que je ne comprend pas c'est que :
1. Si je crée une methode dans la classe crypt_xor, qui n'est pas définit dans l'interface Icrypteur, je ne peux y accéder via mon objet "crypteur"...
ex:
crypteur.fonctionTruc(paramTruc); // Erreur de compilation
2. Si j'ai une variable, ou une constante d'un type ou d'un autre, je ne peux pas y accéder
ex:
maVariable = crypteur.maVariableSpécifiqueXOR;
j'éspére que vous comprendrer mon probléme:
Je veux, a partir d' Icrypteur crée n'importe quel type de crypteur, ayant chacun leurs methode et champ spécifique. Mais je ne connais pas assé la programmation objets pour faire cela sans aide.
Au pire, je mettrai le code en ligne si je peux, car avec les ordis du bahu on est bridé de partout pour telecharger alors pour uploader c'est surement pareil...
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201436 17 déc. 2007 à 12:03
euh... pour les interfaces, il n'y a pas de spécification de la portée...
donc :
public interface
Icrypteur
{
<strike>public</strike> int crypte(...);
<strike>public</strike> int decrypte(...);
}
ensuite... si une méthode est créée dans une classe qui hérite de l'interface, tu ne peux pas l'utiliser à partir de l'interface... puisqu'elle n'est pas commune à l'ensemble des classes qui l'implémentent
Nikoui
Messages postés794Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention19 août 200811 17 déc. 2007 à 12:43
Je pense que tu prend le problème à l'envers :
Le but d'une interface est de définir ce qui est communs à plusieurs classes, un "contrat" que chaque implémentation va remplir : autrement dit, lorsqu'un objet implémente une interface, tu sais qu'il implémentera toutes les méthodes de l'interface. C'est par ce méchanisme que tu peux écrire du code "générique", qui va être utilisable sur n'importe quel "sous type" implémentant l'interface, par exemple une méthode qui prend en paramètre un objet du type de ton interface et qui va pouvoir travailler dessus en utilisant les méthodes déclarées dans l'interface, quelque soit leurs implémentations ou les spécificités de tes classes (c'est ce qu'on appelle le polymorphisme).
Or, dans ton cas, tu parles de méthodes ou de variables spécifiques, qui ne sont donc pas déclarée dans ton interface de base.
Ainsi, tu devrait plutot procéder comme suit :
- Lorsque tu as besoin d'appeler des méthodes spécifiques (ou d'accéder à des variables spécifiques), tu ne dois pas manipuler des "Crypteur", mais des "CrypteurA", "CrypteurB", etc.
- Lorsque tu as besoin d'appeler tes méthodes communes (déclarée dans l'interface) tu pourra passer indifférement un objet "CrypteurA", "CrypteurB", etc à ta méthode, qui elle ne manipulera que des "Crypteur".
Ensuite, tu peux aussi faire des choses comme celle là :
- Déclarer une variable de type "CrypteurA" :
CrypteurA monCrypteurA = new CrypteurA();
- Apeler une méthode qui prend en paramètre un "Crypteur" :
public void MaMethode(Crypteur crypteur)
- Dans ta méthode, si tu dois appeler une fonction spécifique et que tu sais que ton crypteur est bien d'un type spécifique, tu peux caster ton crypteur en CrypteurA :
(crypteur as CrypteurA).MaMethodeSpecifiqueA();
- Pour tester le type de ta variable crypteur par exemple :
if(crypteur is CrypteurA)
{
[...]
}
<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
Mercie beaucoup. Cela m'a permis de poster un debut de sources sur csharp. Maintenant que ma formation de developpeur est terminer je comprend bien mieux la programmation Objet (en faite c'est carrément genial)... par contre le code du crypteur date un peux et pourrais être amélioré je pense, malheureusement je n'ai plus le temp de m'en occupé.
En tout cas, mercie bôcoup pour votre aide à tout les deux.