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_018_ReadOnlyDictiona.../MonLit.cs

55 lines
2.5 KiB

// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : MonLit.cs
// Author : Marc Chevaldonné
// Creation date : 2016-01-10
//
// ========================================================================
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace ex_023_018_ReadOnlyDictionaries
{
/// <summary>
/// L'exemple suivant montre comment encapsuler un dictionnaire dans les cas suivants :
/// => les clés et/ou valeurs sont mutables, c'est-à-dire qu'on peut modifier leur état interne en appelant leurs méthodes ou propriétés
/// => MonLit possède un dictionnaire de paire clé (string)- valeur (Nounours) privée mNounoursDico où Nounours est mutable
/// Comment encapsuler correctement un dictionnaire de ce type ?
/// Dans l'exemple suivant, nous voulons protéger le dictionnaire contre :
/// - les modifications du dictionnaire (ajout ou suppression d'éléments),
/// - la modification du dictionnaire lui-même (on ne doit pas pouvoir faire de new)
///
/// En résumé, nous cherchons à rendre publique en lecture seule, le dictionnaire privé, en laissant chacun de ses éléments modifiables.
///
/// La bonne solution consiste à :
/// - envelopper (wrapper) le dictionnaire privé avec un ReadOnlyDictionary construit dans le constructeur de MonLit.
/// - tant qu'en interne, dans la classe MonLit, on ne change pas la référence de mNounoursDico, le wrapper donne accès en lecture seule au dictionnaire
/// - attention de bien penser à le reconstruire si la référence change !!!
public class MonLit
{
//on veut encapsuler une collection d'un type muable
private Dictionary<string, Nounours> mNounoursDico = new Dictionary<string, Nounours>
{
["Beluga"] = new Nounours(0, "Beluga", new DateTime(2012, 07, 29), 0),
["Singe"] = new Nounours(1, "Singe", new DateTime(2009, 08, 09), 1345),
["Girafe"] = new Nounours(2, "Girafe", new DateTime(2007, 11, 02), 567)
};
public ReadOnlyDictionary<string, Nounours> Nounours
{
get;
private set;
}
public MonLit()
{
Nounours = new ReadOnlyDictionary<string, Nounours>(mNounoursDico);
}
}
}