Я объявил класс с несколькими свойствами
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; }
}
.
.
.
}
Логика, стоящая за этим, состоит в том, чтобы защитить от прямого манипулирования свойствами каждого экземпляра Soil. В геттере дайте копию, в сеттере попросите "целый" почвенный объект.
Из того, что я уже понял, другие решения могут быть такими:
сделать класс Soil неизменяемым,
вернуть список только для чтения (но тогда ссылочными типами внутри можно будет манипулировать),
превратить класс Soil в структуру (простую),
дополнить класс Soil некоторой логикой (методами и т.д.).
Я хотел бы спросить, имеет ли вообще вышеуказанное «решение» какую-либо ценность или оно плохо определено.
Я думаю, что это типичная ситуация, например, у вас есть коллекция ссылочных типов и вы хотите их инкапсулировать. Каковы типичные рамки мышления в этих ситуациях?
EDIT:
Хорошо, после прочтения ответов я изменил решение для этого
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 нуждался в логике внутри себя, а не внутри другого класса. Отпишусь, если найду недостатки.