Декларирах клас с няколко свойства
class Soil
{
public double AnglePhi { get; set; }
public double AngleDelta { get; set; }
.
.
.
}
Сега, за да манипулирам колекция от тях, създадох друг специален клас, само поради тази причина.
class Soils
{
private const Byte numberOPredefined = 10;
private IList<Soil> soils;
public Soil this[ushort i]
{
get { return new Soil() { AngleDelta = soils[i].AngleDelta, ... }; }
set { if (i > numberOPredefined) soils[i] = value; }
}
.
.
.
}
Логиката зад това е да се защити донякъде от директна манипулация на свойствата на всеки екземпляр на почвата. Дайте копие в getter, поискайте "цял" почвен обект в setter.
От това, което разбрах досега, други решения биха могли да бъдат:
да направи класа на почвата неизменен,
да върне списък само за четене (но тогава референтните типове вътре могат да бъдат манипулирани)
да превърне класа на почвата в struct (просто),
увеличете класа на почвата с известна логика (методи и т.н.).
Бих искал да попитам дали горното "решение" изобщо има някаква стойност или е зле дефинирано.
Според мен това е типична ситуация, например да имате колекция от референтни типове и да искате да ги капсулирате. Каква е типичната рамка на мислене в тези ситуации?
РЕДАКТИРАНЕ:
Добре, след като прочетох отговорите, промених решението за това
class Soil
{
private readonly double _AnglePhi;
public double AnglePhi { get { return _AnglePhi; } }
private readonly double _AngleDelta;
public double AngleDelta { get { return _AngleDelta; } }
.
.
}
class SoilCollection
{
private List<Soil> _Soils;
public IList<Soil> Soils { get { return _Soils.AsReadOnly(); } }
.
.
}
Мисля, че класът Soil имаше нужда от логика вътре в себе си, а не вътре в друг клас. Ще пиша, ако открия недостатъци.