public ClassDefinition(SchemeNode parent, string name, bool copyExtensions, ClassDefinition[] extensions, params SlotDefinition[] slots) : base(parent) { if (parent == null) InnerIsSchemeEditable = false; CopyExtensions = copyExtensions; InnerName = name; InnerFullName = Version.ToString("D"); if (extensions != null && extensions.Length > 0) foreach (ClassDefinition ext in extensions) if (!InnerInheritanceList.Contains(ext.Name)) InnerExtend(ext, false, true); InnerInheritanceList[KeyName] = this; // Если в InheritanceList-е будут FullName, то потом сложно производить // диспач для бихейверов. // всущности, фул-нейм нужен, что бы сигнализировать о наличии "динамических" классов всписке // но не понятно, зачем это нужно! // XXX был Add, поменял на [] (Pilya) //KeyName, // this); if (slots != null && slots.Length > 0) foreach (SlotDefinition slot in slots) if (slot != null) InnerAddSlot(slot, true, true); if (CopyExtensions) InnerBehavior = new BehaviorDispatcher(this); else ;// ?? надо думать! }
public ClassDefinition(string name, bool copyExtensions, ClassDefinition[] extensions, params SlotDefinition[] slots) : this(null, name, copyExtensions, extensions, slots) { }
public ClassDefinition(SchemeNode parent, string name, ClassDefinition[] extensions, params SlotDefinition[] slots) : this(parent, name, true, extensions, slots) { }
public ClassDefinition(string name, ClassDefinition extension, params SlotDefinition[] slots) : this(name, new ClassDefinition[] { extension }, slots) { }
protected virtual bool InnerExtend(ClassDefinition extension, bool raiseEvent, bool parent) { if (extension == null || extension == this) return false; string name = KeyName; int ext_index = InnerInheritanceList.GetKeyIndex(extension.Name); int my_index = (parent) ? InnerInheritanceList.GetKeyIndex( name ) : -1; // все алгоритмы должны работать для "my_index", // тогда можно будет менять порядок своих предков if (ext_index > 0 && my_index > 0 && my_index >= ext_index) // класс уже есть в списке наследования перед нами return false; InnerFullInheritanceList = null; // что бы пересчитать потом if (CopyExtensions) { // добавить список наследования "перед" указанным индексом // (если my_index < 0, то добавим в конец) //extension.PopulateInheritanceList( InnerInheritanceList, my_index); // { для варианта "хранить только список непосредственных родителей" if (parent && my_index >= 0) InnerInheritanceList.InsertAt(my_index, extension.Name, extension); else InnerInheritanceList[extension.Name] = extension; // } if (ext_index < 0) { UpdateSlotListAfterExtention(ListChangeType.Add, extension); } else { // TODO: если extension переместили, то список определения слотов тоже // должен перестроиться.. // и методов... } } else { if (parent && my_index >= 0) InnerInheritanceList.InsertAt(my_index, extension.Name, extension); else InnerInheritanceList[extension.Name] = extension; // XXX точно не нужно навещивать обработчики? // extension.AfterSlotListChanged += OnExtensionSlotListChanged; } if ( raiseEvent ) OnExtension(ListChangeType.Add, extension); return true; }
public virtual IDataContainer CreateDataContainer(ClassDefinition cls) { throw new Exception("The method or operation is not implemented."); }
public virtual IObjectScope CreateScope(ClassDefinition cls) { throw new Exception("The method or operation is not implemented."); }
//................................................................. public virtual IObject Create(ClassDefinition cls, params object[] args) { throw new Exception("The method or operation is not implemented."); }
//......................................................................... public virtual bool Apply(ClassDefinition cls, params object[] args) { ExtenderDelegate body = Body; if (body == null) return false; return body(cls, args) != null; }
public LObject(ClassDefinition definition) : base(definition) { }
// TODO: сделать ThreadSafe! protected virtual string InnerSetClass(string name, ClassDefinition cd) { if (cd == null) return null; if (name == null) name = cd.Name; if (name == null) return null; // TODO: а зря! name = name.Trim().ToLower(); if (name == "") return null; ArrayList cl = InnerClasses[name] as ArrayList; if (cl == null) InnerClasses[name] = cl = new ArrayList(); cl.Insert(0, cd); return name; }
// TODO RegisterClass может сам делать добавленные классы read-only. Этого может не делать MetaInfoConfigurator public virtual ClassDefinition RegisterClass(ClassDefinition cls) { if (cls != null) InnerSetClass(cls.Name, cls); return cls; }