// ======================================================================== // // Copyright (C) 2016-2017 MARC CHEVALDONNE // marc.chevaldonne.free.fr // // Module : Program.cs // Author : Marc Chevaldonné // Creation date : 2016-09-30 // // ======================================================================== using System.Collections.Generic; namespace ex_023_016_ReadOnlyCollection { class Program { /// /// L'exemple suivant montre comment encapsuler une collection d'un type dans les deux cas principaux suivants : /// 1) le type est immuable (en façade au moins), c'est-à-dire qu'on ne peut pas modifier son état interne en appelant ses méthodes ou propriétés /// => MonLit possède une collection privée mNounours de Nounours où Nounours est immuable /// 2) le type est mutable, ie que l'utilisateur peut modifier l'état interne de ses instances, et notre API l'autorise. /// => MonLit2 possède une collection privée mNounours2 de Nounours2 où Nounours2 est mutable /// Comment encapsuler correctement une collection d'un tel type ? /// Dans l'exemple suivant, nous voulons protéger la collection contre : /// - les modifications de la collection (ajout ou suppression d'éléments), /// - la modification de la collection elle-même (on ne doit pas pouvoir faire de new) /// Nous ne cherchons pas à protéger les éléments de la collection (en particulier si le type n'est pas immuable). /// En résumé, nous cherchons à rendre publique en lecture seule, la collection privée de nounours du lit. /// static void Main(string[] args) { //Test avec MonLit qui possède une collection d'un type immuable (Nounours) MonLit monlit = new MonLit(); monlit.NounoursList.RemoveAt(0); // dangereux ! (monlit.NounoursIEnumerable as List).RemoveAt(0); // c'est mieux, mais pas suffisant... (monlit.NounoursIROC as List).RemoveAt(0); // idem //List test = (monlit.NounoursROC as List); // pas possible //monlit.NounoursROC[0] = new Nounours(5, "betterave", DateTime.Now, 0); // pas possible //List test = (monlit.NounoursROC2 as List); // pas possible //monlit.NounoursROC2[0] = new Nounours(5, "betterave", DateTime.Now, 0); // pas possible //Test avec MonLit2 qui possède une collection d'un type mutable (Nounours2) MonLit2 monlit2 = new MonLit2(); monlit2.Nounours2List.RemoveAt(0); // dangereux ! (monlit2.Nounours2IEnumerable as List).RemoveAt(0); // c'est mieux, mais pas suffisant... (monlit2.Nounours2IROC as List).RemoveAt(0); // idem //List test = (monlit2.Nounours2ROC as List); // pas possible //monlit2.Nounours2ROC[0] = new Nounours2(5, "betterave", DateTime.Now, 0); // pas possible //List test = (monlit2.Nounours2ROC2 as List); // pas possible //monlit2.Nounours2ROC2[0] = new Nounours2(5, "betterave", DateTime.Now, 0); // pas possible //on peut toujours modifier les instances de Nounours2, mais c'était voulu ! monlit2.Nounours2ROC[0].NbPoils = 1; } } }