public class MyClass {
public class MyData {
public int Parm {get;set;}
public int Calc {get;set;}
}
protected Dictionary<MyData> workData = new Dictionary<MyData>();
public void Calculate(){...}
protected void Change(){...}
public Dictionary<...> DataSource {get{...};set{...};}
}
Класс содержит в себе словарь с данными, над которыми работает. Каждый элемент содержит два свойства — Parm и Calc. С другими классами обмен данных идет, через свойство DataSource, которое так-же является словарем и так-же каждый элемент содержит свойства Parm и Calc. Данные внутреннего словаря и словаря свойства класса — совпадают.
Однако:
1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.
2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.
Здравствуйте, CyberRussia, Вы писали:
CR>1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.
CR>Как такое реализовать?
Например так:
public class MyData
{
public int Parm { get; set; }
public int Calc { get; protected set; }
}
private class MyCalcData : MyData
{
public new int Calc { get => base.Calc; set => base.Calc = value; }
}
Внутри оперируешь объектами типа MyCalcData, а снаружи они видны как MyData.
CR>2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.
Для Parm поступаешь также — в MyCalcData — переопределяешь поведение Parm.
Для количества элементов в словаре — история отдельная. Так в лоб не получится. Придётся делать обёртку над словарём, реализующую его интерфейс(ы), или использовать готовую, или свои методы работы со словарём предоставлять, или ещё что может другое — тут по конкретной задаче надо смотреть.
Серёжа Новиков,
программист
Re: Ограничение доступа к элементом словаря, являющемуся свойством класса
Здравствуйте, CyberRussia, Вы писали:
CR>1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.
вынести в отдельный проект и для set прописать internal
либо выделить интерфейс IMyData с нужными свойствами и наружу его выставлять, а внутри MyClass кастовать к MyData по мере необходимости.
CR>2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.
CR>Как такое реализовать?
В MyData реализовать INitifyPropertyChanged или просто отдельное событие сделать, а в MyClass подписываться на события от элементов и вызывать Change.
Для словаря сделать что-то типа ObservableDictionary, который так же будет уведомлять об изменении (INotifyCollectionChanged или опять же своё событие).
В целом задача выглядит странно, подозреваю, что уже с этими словарями выбрано не лучшее решение и они только усложнят жизнь.
Re[2]: Ограничение доступа к элементом словаря, являющемуся свойством класса
Здравствуйте, karbofos42, Вы писали: K>В целом задача выглядит странно, подозреваю, что уже с этими словарями выбрано не лучшее решение и они только усложнят жизнь.
Словарь потому что он дает высокую скорость доступа на выборку / чтение по идентификатору отдельного элемента. И позволяет отображать себя и редактировать в гриде GUI без особых проблем. Сразу хочу сказать, что вариант ограничиться запретом на редактирование в гриде GUI отдельного столбца недостаточен.
Re: Ограничение доступа к элементом словаря, являющемуся свойством класса
Здравствуйте, CyberRussia, Вы писали:
CR>Добрый день,
CR>public class MyClass { CR> public class MyData { CR> public int Parm {get;set;} CR> public int Calc {get;set;} CR> } CR> protected Dictionary<MyData> workData = new Dictionary<MyData>();
CR> public void Calculate(){...}
CR> protected void Change(){...}
CR> public Dictionary<...> DataSource {get{...};set{...};} CR>}
CR>Класс содержит в себе словарь с данными, над которыми работает. Каждый элемент содержит два свойства — Parm и Calc. С другими классами обмен данных идет, через свойство DataSource, которое так-же является словарем и так-же каждый элемент содержит свойства Parm и Calc. Данные внутреннего словаря и словаря свойства класса — совпадают. CR>Однако: CR>1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения. CR>2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.
CR>Как такое реализовать?
Можно поменять местами MyData и MyClass, вложенный класс имеет доступ к приватным полям включающего класса.
public class MyData
{
public int Parm { get; set; }
public int Calc { get; private set; }
public class MyClass
{
protected Dictionary<int, MyData> workData = new Dictionary<int, MyData>();
public void Calculate() { }
protected void Change() { }
public Dictionary<int, MyData> DataSource
{
get
{
return workData;
}
set
{
workData = value;
workData[0].Calc = 30;
}
}
}
}
Программа – это мысли спрессованные в код
Re[3]: Ограничение доступа к элементом словаря, являющемуся свойством класса
Здравствуйте, CyberRussia, Вы писали:
CR>Здравствуйте, karbofos42, Вы писали: K>>В целом задача выглядит странно, подозреваю, что уже с этими словарями выбрано не лучшее решение и они только усложнят жизнь.
CR>Словарь потому что он дает высокую скорость доступа на выборку / чтение по идентификатору отдельного элемента. И позволяет отображать себя и редактировать в гриде GUI без особых проблем. Сразу хочу сказать, что вариант ограничиться запретом на редактирование в гриде GUI отдельного столбца недостаточен.
для грида можно и IEnumerable отдавать, ему доступ по индексу не нужен, а для доступа по индексу отдельное свойство-индексатор завести.