Я объявил класс с несколькими свойствами
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.Дайте копию в getter, попросите «целый» объект почвы в setter.
Из того, что я до сих пор читал, могут быть другие решения:
сделать класс почвы неизменным,
вернуть список ReadOnly(но тогда можно манипулировать ссылочными типами внутри).
превратить класс Soil в struct (simple),
дополнить класс Soil некоторой логикой (методами и т. д.).
Я хотел бы спросить, имеет ли вышеуказанное «решение» какое-либо значение или оно плохо определено.
Это типичная ситуация, я думаю, например, имея коллекцию ссылочных типов и хочу инкапсулировать их .Каков типичный образ мышления в этих ситуациях?
РЕДАКТИРОВАТЬ:
Хорошо, после прочтения ответов я изменил решение для этого
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 нужна логика внутри него, а невнутри другой класс.Я опубликую, если найду какие-либо недостатки.