public override АМОбъект Восстановить(BinaryReader читатель) { СобственныйАдресПримитива = new Адрес(); СобственныйАдресПримитива = (Адрес)СобственныйАдресПримитива.Восстановить(читатель); НомерБайтаВФайле = читатель.ReadInt32(); return(this); }
//сообщения от объектов обратной связи //объект обратной связи разрывает связь public void УдалитьСвязьИзСпискаОбратныхСвязей(Адрес удаляемыйАдрес) { ; // найти связь в СпискеОбратныхСвязей var удаляемаясвязь = СписокОбратныхСвязей.Find(связь => связь.АдресОбъекта == удаляемыйАдрес); СписокОбратныхСвязей.Remove(удаляемаясвязь); }
public static void ДобавитьПоле(Адрес адресКласса, ГруппаОбъектов поле) { var класс = (ГруппаОбъектов)адресКласса.АдресВКуче(); // проверить что класс это класс // что поле это поле ((ГруппаОбъектов)класс[2]).Добавить(поле); }
public АктивностьСложение(Адрес адресСлогаемого1, Адрес адресСлогаемого2) : base() { var Связь = ДайСвязьПоИмени("Слогаемое1"); Связь.АдресУдаленнойСвязи = адресСлогаемого1; //т.к. сервер надо установить Соственныйадрес var связь2 = ДайСвязьПоИмени("Слогаемое2"); связь2.АдресУдаленнойСвязи = адресСлогаемого2; }
public void СообщитьПодписчикамОбИзмененииСобственногоАдреса(Адрес новыйАдрес) { foreach (var связь in СписокОбратныхСвязей) { dynamic объектОбратнойСвязи = связь.АдресОбъекта.АдресВКуче(); объектОбратнойСвязи.ИзменитьАдресПрямойСвязи(СобственныйАдрес, новыйАдрес); } // в случае успеха СобственныйАдрес = новыйАдрес; }
public override АМОбъект Восстановить(BinaryReader читатель) { АдресРегистратора = (Адрес)АМОбъект.Создать(читатель.BaseStream); // востановление происходит в другом адресном пространстве // если это адрес из другого адресногопространства тто его можно не менятть // если локальное, то нужно добавить адрес удаленной машины return(this); }
public АдресУРегистратора ПолучиАдресУРегистратора(Адрес адресРегистратора) // запускается только при создании новой связи перенести в сам регистратор { var регистратор = ( егистраторАдресов)адресРегистратора.АдресВКуче(); Пароль = Guid.NewGuid(); АдресСобственный = регистратор.ЗарегистрируйНаСвободныйАдрес(this, Пароль); return(СвойАдресУРегистратора); //СловарьСобственныхАдресовУРегистраторов[регистратор] = адрес; // плодить адреса у связи не стоит, многосвязей может быть у активности //СписокСобственныхАдресов.Add(адрес); // можно просмотреть все адреса и сравнить регистраторв }
public bool Заменить(Адрес адрес, ПримитивИлиАдрес новоеЗначение) { var адр = адрес as АдресВГруппе; if (адр == null) { return(false); } Список[адр.НомерВГруппе] = новоеЗначение; return(true); }
public ПроксиОбъекта ДайЭлемент(int индекс, Адрес адресВладельца) // дается копия элемента { var элемент = new ПроксиОбъекта(); элемент.АдресПримитива = (Адрес)Список[индекс].СобственныйАдресПримитива.Копировать(); //элемент.Примитив = Список[индекс].Копировать(); СписокВладельцевЭлементов[индекс].Add(адресВладельца); //Подписать на изменеия значения, адреса, значения примитива return(элемент); }
public ПроксиОбъекта ДайЭлемент(Адрес адрес, Адрес адресВладельца) // дается копия элемента { var индекс = ((АдресВГруппе)адрес).НомерВГруппе; var элемент = new ПроксиОбъекта(); элемент.АдресПримитива = (Адрес)Список[индекс].СобственныйАдресПримитива.Копировать(); //элемент.Примитив = Список[индекс].Копировать(); СписокВладельцевЭлементов[индекс].Add(элемент.СобственныйАдресПримитива); //собственный адрес элемента еще не определен, указывается адрес в Куче адреса //Подписать на изменеия значения, адреса, значения примитива return(элемент); }
public АМОбъект СоздатьКопиюОбъект(Адрес адрес) //читает только первый уровень, не лезет разбирать адреса { var фАдрес = адрес as АдресВФайле; if (фАдрес == null) { return(Пустота.Статик); } Читатель.BaseStream.Position = фАдрес.НомерБайтаВФайле; //перместить указатель на адрес объекта var прим = АМОбъект.Создать(Читатель.BaseStream); return(прим); }
//сообщения от объектов прямой связи // Адрес Объекта прямой связи изменился, необходимо внести изменения в существующую связь //объект переехал public void ИзменитьАдресПрямойСвязи(Адрес старыйАдрес, Адрес новыйАдрес) { var стараяСвязь = ПрямыеСвязи.Find(связь => связь.АдресОбъекта == старыйАдрес); if (стараяСвязь != null) { стараяСвязь.АдресОбъекта = новыйАдрес; } else //ошибка - несущесствующаясвязь { //передатьсообщение объекту по старому адресу удалить обратную связь dynamic объектПоСтаромуАдресу = старыйАдрес.АдресВКуче(); объектПоСтаромуАдресу.УдалитьСвязьИзСпискаОбратныхСвязей(СобственныйАдрес); } }
public ПроксиОбъекта ДайЭлементСловаря(Адрес адрес) { var элемент = ДайЭлемент(адрес, СобственныйАдресПримитива); // везде добавляется собственный адрес группы // в списке владельцев будет куча одного и тогоже адреса группы - исправить // группа должна содержать реакцию на изменние словаря, нужно найти элементы адресом больше или равно изменяемого адреса и поменять их на единицу больше или меньше // если связь со словарем разорвана, то измения могут потеряться // врианты иметь локальную копию словаря и каждый раз сравнивать версию // редактирование словаря приводит к созданию новой копии и таблицы изменения // изменения: удален элемент с номером, изменен адрес того же алемента, новый элемент // если эменты сложные например группа и поменялась группа, замена return(элемент); }
public static ГруппаОбъектов СоздатьПоле(string имя, Адрес адресТипаПоля) //адрес типа поля { // это описание поля var поле = new ГруппаОбъектов { [0] = new Строка("поле"), [1] = new Строка(имя), [2] = адресТипаПоля, [3] = new Строка("Значение")// это значение нужно только для объекта с полным самоописанием, значение поля экземпляра содержиться в экземпляре }; // лучше указать адрес (адрес справочника, номер строки) // поле "принадлежит" типу или экзепляру return(поле); }
public АМОбъект this[Адрес адрес] { get { var индекс = ((АдресВГруппе)адрес).НомерВГруппе; var адресВКуче = АдресаОбъектовВКуче[индекс] as АдресВГруппе; return(АдресКучи[адресВКуче]); } set { var индекс = ((АдресВГруппе)адрес).НомерВГруппе; var адресВКуче = АдресаОбъектовВКуче[индекс] as АдресВГруппе; АдресКучи[адресВКуче] = value; } }
public override АМОбъект this[Адрес адрес] { get { switch (адрес) { case АдресИндексаВФайле а: return(ДайОбъектПоИндексу(а.НомерИндексаВФайле)); case АдресВФайле а: return(СоздатьКопиюОбъект(а)); } return(Пустота.Статик); } set { base[адрес] = value; } }
public ЦелоеЧисло Сложи(Адрес АдресСлогаемого1, Адрес АдресСлогаемого2) // услуга -- нет смысла хранить ни слогаемые ни сумму есть проблема с параллельным выполнением надо делать временные связи { var связь = new Связь() { АдресУдаленнойСвязи = АдресСлогаемого1 }; var слог1 = (ЦелоеЧисло)связь.ПередайКоманду(new Команда("ДайЗначение")); связь.АдресУдаленнойСвязи = АдресСлогаемого2; var слог2 = (ЦелоеЧисло)связь.ПередайКоманду(new Команда("ДайЗначение")); return(new ЦелоеЧисло(слог1.Значение + слог2.Значение)); ДайСвязьПоНомеру(0).АдресУдаленнойСвязи = АдресСлогаемого1; ДайСвязьПоНомеру(1).АдресУдаленнойСвязи = АдресСлогаемого2; return(new ЦелоеЧисло(Слогаемое(0).Значение + Слогаемое(1).Значение)); }
// собственный адрес для обратного вызова присваивается новым владельцем и сообщается источнику хранения public override ПримитивИлиАдрес Восстановить(Stream поток) // где восстановить { var адресГдеВостановить = СобственныйАдресПримитива.СоздатьСвязь().АдресУдаленнойСвязи; // пусть эта связь доступна Как параметр var адресУдаленный = (АдресУниверсальный)Создать(поток); // это адрес локальный АдресВХрналище, например var текущийадрес = new АдресУниверсальный(); текущийадрес.АдресРегистратора = адресГдеВостановить; текущийадрес.СобственныйАдресПримитива = адресГдеВостановить; текущийадрес.КомандаОбъекту = new Команда("ДайЭлемент", адресУдаленный); АдресПримитива = текущийадрес; // это код для Активности или var канал = АдресПримитива.ТипКанала(); var группа = АдресПримитива.АдресРегистратора;// это адрес группы return(base.Восстановить(поток)); }
// public static void СоздайОдностороннююСвязьВПамяти(Адрес АдресИсходящаяАктивность, Адрес адресВходящаяАктивность) { var исходящаяАктивность = (Активность)АдресИсходящаяАктивность.АдресВКуче(); var входящаяАктивность = (Активность)адресВходящаяАктивность.АдресВКуче(); // в исходящей создается клиент var связьВисходящей = new Связь() { ТипСвязи = "исходящая", ИмяСвязи = "передатчик", }; var адресВИсходящей = исходящаяАктивность.ДобавьСвязь(связьВисходящей); // это относительныйАдрес связи относительно активности // созлается сервер var связьВоВходящей = new Связь() { ИмяСвязи = "приемник", ТипСвязи = "входящая", АдресУдаленнойСвязи = адресВИсходящей }; var адресВоВходящей = входящаяАктивность.ДобавьСвязь(связьВоВходящей); связьВисходящей.АдресУдаленнойСвязи = адресВоВходящей; }
// СписокВходящих = null public bool Подписаться(Адрес адресПодписчика) // добавить в список связей новую связь с типом связи (роль= подписчик, тип =исходящий, инициатива- активная или пассивная // , связь создается в зависимости от адреса, роли, типа ) { return(true); }
public virtual ПроксиОбъекта this[Адрес адрес] { get { return(null); } set { } }
public virtual АМОбъект this[Адрес адрес] { get { return(null); } set { } }
public override ПроксиОбъекта this[Адрес адрес] { get { return(base[адрес]); } set { base[адрес] = value; } }
public void СоздатьКопиюОбъектВПрострастве(Адрес адрес, ГруппаОбъектов Память) //временное сохранение в памяти объекта { var объект = СоздатьКопиюОбъект(адрес); Память.Добавить(объект); // можно сохранить еще в хранилище это сохраняемый объект, а не временный, Память нужно в конце очищать или заводить отдельную группу с путым сохранением }