Czytam sobie "Head First". Wydanie 3. Tam, w rozdziale 8 jest zdanie:
It’s great for encapsulation, too. If you expose an IEnumerable<T> instead of, say, a List<T>, then you can’t accidentally
write code that modifies it.
co na polski zostało przetłumaczone:
Rozwiązanie to poprawia także hermetyczność klasy. Jeśli udostępnisz składową typu IEnumerable<T>, a nie na przykład List<T>, to nikt nie będzie mógł przypadkowo napisać kodu, który zmodyfikuje zawartość kolekcji.
Czy mógłby ktoś podać mi przykład, o co tu chodzi?
Przecież mogę rzutować, jak poniżej, i dobierać się do zawartości tej kolekcji.
using System;
using System.Collections.Generic;
namespace Hermetyzacja_Lista_IEnumerable {
class Program {
private static Konto konto;
static void Main(string[] args) {
Console.WriteLine("Gostek założył konto ...");
konto = new Konto();
Console.WriteLine("i wpłacił kasę ...");
for (int i = 0; i < 5; i++) {
konto.ZałóżLokatę(10000, "PLN");
}
Console.WriteLine("i z zadowoleniem sprawdził stan:\n\r");
konto.Raport();
Console.WriteLine("ale ktoś mu zrobił kawał ...\n\r");
List<Lokata> lokaty = (List<Lokata>)konto.Lokaty;
lokaty.Clear();
for (int i = 0; i < 5; i++)
{
konto.ZałóżLokatę(10000, "BYR");
}
Console.WriteLine("i następnego dnia zobaczył:\n\r");
konto.Raport();
Console.ReadKey();
}
}
public class Lokata {
private int kwota;
private string waluta;
public Lokata(int ile, string wCzym) {
kwota = ile;
waluta = wCzym;
}
public override string ToString() {
return kwota.ToString("## ##0 ") + waluta;
}
}
public class Konto
{
private List<Lokata> lokaty;
public Konto() {
lokaty = new List<Lokata>();
}
public void ZałóżLokatę(int ile, string wCzym) {
lokaty.Add(new Lokata(ile, wCzym));
}
public void Raport() {
Console.WriteLine("Stan konta:");
for (int i = 0; i < lokaty.Count; i++) {
Console.WriteLine("Lokata nr " + (i + 1) + ": " + lokaty[i]);
}
Console.WriteLine("");
}
public IEnumerable<Lokata> Lokaty {
get { return lokaty; }
}
}
}