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.
Version imprimable
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.
:mrgreen:
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).
je confirme hihi
"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 ... 8O
OuiCitation:
"Cela veut dire :
Que openWith est un IDictionnary."
Donc openWith est il limité aux membres de IDictionnary ?
Aussi ! :)Citation:
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:
1
2
3
4
5
6 public interface IVehicule { public void demarrer(); public void arreter(); }
Si tu fais :Code:
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:
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:
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, ... :koi: 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:
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: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 (styleCode:IVehicule vehi = new Voiture();
)Code: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:
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:Voiture vehi = new Voiture();
J'espère vraiment que c'est ça ...
Pour faire simple :
crée un nouvel objet de type Voiture.Code: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: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 à vous ...:yaisse2:
Merci aussi à Gull pour l'explication détaillée du concept. Je m'endormirai moins bete ce soir.
:D