VD>В С# доступна инкапсуляция которая позволяет создать immutability-объекты. Отальное от лукавого.
VD>Главное, что этого достаточно для создания immutability-классов решающих поставленную проблему.
Нифига это не решает проблеммы.
Вот пример на С++ из реальной жизни
struct KnotVector
{
double knot_at( int idx ) const;
void resize( int p, int n );
};
struct PointVector
{
const HPoint& point_at( int idx ) const;
void resize( int n );
};
// а теперь внимание сюда:
class NurbsCurve
{
KnotVector m_U;
PointVector m_Pw;
public:
const KnotVector& U() const { return m_U; }
const PointVector& Pw() const { return m_Pw; }
// вот здесь:
void resize( int p, int n )
{
m_U.resize(p,n);
m_Pw.resize(n);
}
};
Классы KnotVector и PointVector могут юзатся пользователем сами по себе или как агреггаты в других классах NurbsCurve, NurbsSurface и т.п. Причем когда они юзаются как часть агрегата естественно что модификация возможна только классом владельцем.
Если бы не было const то пришлось бы копировать read-only интерфейс KnotVector и PointVector в каждый из классов:
class NurbsSurface
{
KnotVector m_U, m_V;
public:
double u_knot_at(int idx);
double v_knot_at(int idx);
// и еще тридцать методов
};
А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?