Cela veut dire que l'instance openWith ne peut utiliser que les membres de l'interface IDictionary (puisque c'est son type lors déclaration) pour accéder aux membres (cachés pour le cas) de Dictionnary. Est ce bien cela ?
Merci pour vos lumières.
A.
Discussion :
Cela veut dire que l'instance openWith ne peut utiliser que les membres de l'interface IDictionary (puisque c'est son type lors déclaration) pour accéder aux membres (cachés pour le cas) de Dictionnary. Est ce bien cela ?
Merci pour vos lumières.
A.
Non.
Cela veut dire :
Que openWith est un IDictionnary.
Qu'il est instancié comme Dictionnary.
Que les Key seront des String.
Que les Value seront des String.
Il s'agit d'une collection générique (doublement pour le coup).
"Cela veut dire :
Que openWith est un IDictionnary."
Donc openWith est il limité aux membres de IDictionnary ? Ou peut il accéder aux membres de Dictionnary ?
"Qu'il est instancié comme Dictionnary."
Qu'est ce que cette dernière phrase signifie vraiment ? C'est vraiment pas clair pour moi ...![]()
Oui"Cela veut dire :
Que openWith est un IDictionnary."
Donc openWith est il limité aux membres de IDictionnary ?
Aussi !Ou peut il accéder aux membres de Dictionnary ?
Prenons un cas plus simple, pour expliquer cette notion d'héritage/interface.
tu as une interface :
et une classe qui l'implémente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public interface IVehicule { public void demarrer(); public void arreter(); }
Si tu fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class Voiture : IVehicule { // trucs de l'interface public void demarrer(){ /*du code*/ } public void arreter(){ /*du code*/ } // autres trucs protected List<Roue> mesRoues; public void tourner(){ /*du code*/} }
alors ta voiture pourra faire tout ce qu'un Vehicule peut faire, + tout ce qu'une voiture peut faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 IVehicule voiture1 = new Voiture();
Il s'agit de la notion d'héritage. Si tu comprend mal ,fais quelques recherche, c'est largement expliqué partout. Si tu as d'autres questions précises , n'hésite pas !
Non : uniquement ce que IVehicule peut faire.
Pour utiliser Voiture, il faudra tenter un cast.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 IVehicule Vehicule; if( isEnforme ) { Vehicule = new Voiture(); } else { Vehicule = new Moto(); } Vehicule.Weeling(); ===> compil pas, car cest uniquement chez une moto
cependant, ...en procédant comme suit :
Voiture voiture1 = new Voiture();
au lieu de
IVehicule voiture1 = new Voiture();
Je pourrai aussi faire tout ce qu'un véhicule peut faire non. Puisqu'un objet de type voiture implémente nécessairement l'interface IVéhicule ... ?
C'est à ce niveau là que je bloque dans le concept d'héritage en fait. Qu'est ce qui différencie ces deux lignes de code ?
Dans ton exemple on peut donc logiquement faire (?) : voiture1.tourner();
Vais faire quelques recherches sur le ouaib ...
A.
voit faire tout ce qu'une Voiture peut faire, et donc un Vehicule (le contrat est signé avec l'interface : tout ce qu'elle contient est obligatoire dans voiture )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IVehicule vehi = new Voiture(); Voiture voit = new Voiture();
vehi peut faire tout ce qu'un Vehicule peut faire.
Après a toi de voir :
Si je ne sais pas qu'elle Vehicule sera utilisé... Je met obligatoirement une Voiture au risque de renfermé toute évolutivité?
Ou je met un Vehicule? Et à l'avenir on pourra meme utiliser un tricyle? Le code qui suivra ne changera pas?
L'utilisation de l'interface te permet de faire :
et de mettre des Voiture, des Avions, etc.. dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part List<IVehicule> liste;
Désolé pour l'oubli du cast :s
Pour repprendre un peu tout ce qui a été dit :
Permet de faire tout ce que peut faire un véhicule et des choses spécifiques à une voiture (style
Code : Sélectionner tout - Visualiser dans une fenêtre à part IVehicule vehi = new Voiture();)
Code : Sélectionner tout - Visualiser dans une fenêtre à part vehi.quatreRouesMotrices = true;
Ensuite, si je fais pointer vehi sur un tricycle :
Je peux donc faire tout ce que fait un véhicule et un tricycle (rouler dans un square par ex). Mais je ne peux plus faire des choses de voiture (quatre roues motrices). C'est ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Tricycle monPetitBiclou = new Tricycle(); vehi = monPetitBiclou ;
Or si au départ je déclare vehi de type Voiture comme suit :
, je suis bloqué pour le faire pointer sur un objet de type Tricycle et lui faire faire des choses de tricycle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Voiture vehi = new Voiture();
J'espère vraiment que c'est ça ...
Pour faire simple :
crée un nouvel objet de type Voiture.
Code : Sélectionner tout - Visualiser dans une fenêtre à part new Voiture();
crée un objet de type Voiture, crée une référence (nommée vehi) de type IVehicule, et fait pointer cette référence vers l'objet créé par new Voiture().
Code : Sélectionner tout - Visualiser dans une fenêtre à part IVehicule vehi = new Voiture();
Tu te retrouves donc avec en mémoire un objet de type Voiture, et une référence de type IVehicule sur cet objet.
L'utilité ? En l'occurence, pour les dictionnaires, il existe plein de classes(Dictionary, HashTable, SortedList, ...) qui implémentent l'interface IDictionary. Elles sont optimisées différemment et sont donc adaptées à des besoins précis.
Mais ça, le code utilisant ta référence s'en fout. Tout ce qu'on veut, c'est faire des mondico[cle] = valeur, des foreach dessus, etc.
Donc la référence est du type "fonctionnel", et ce n'est qu'à l'instantiation qu'on s'intéresse de savoir que ce IDico est en fait un Dico et pas un SortedList par exemple. Si on veut passer de l'un à l'autre, il suffit de changer la ligne où l'on instancie notre objet, et c'est tout.
J'espère que c'est clair
Et pour finir : ton objet référencé par vehi EST une voiture : (vehi is Voiture) renvoie true. Bien sûr si après dans le code tu fais vehi = new Tricycle(), ce sera (vehi is Tricycle) qui sera vrai.
Merci aussi à Gull pour l'explication détaillée du concept. Je m'endormirai moins bete ce soir.
![]()
Partager