You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mchsamples-.net-core/ex_023_016_ReadOnlyCollection/Program.cs

73 lines
3.5 KiB

// ========================================================================
//
// 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
{
/// <summary>
/// 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.
/// </summary>
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<Nounours>).RemoveAt(0); // c'est mieux, mais pas suffisant...
(monlit.NounoursIROC as List<Nounours>).RemoveAt(0); // idem
//List<Nounours> test = (monlit.NounoursROC as List<Nounours>); // pas possible
//monlit.NounoursROC[0] = new Nounours(5, "betterave", DateTime.Now, 0); // pas possible
//List<Nounours> test = (monlit.NounoursROC2 as List<Nounours>); // 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<Nounours2>).RemoveAt(0); // c'est mieux, mais pas suffisant...
(monlit2.Nounours2IROC as List<Nounours2>).RemoveAt(0); // idem
//List<Nounours> test = (monlit2.Nounours2ROC as List<Nounours2>); // pas possible
//monlit2.Nounours2ROC[0] = new Nounours2(5, "betterave", DateTime.Now, 0); // pas possible
//List<Nounours> test = (monlit2.Nounours2ROC2 as List<Nounours2>); // 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;
}
}
}