예제 #1
0
        protected virtual PuppetLevel CloneForReal(PuppetLevelData newData)
        {
            var clone = (PuppetLevel)MemberwiseClone();

            clone.Data = newData;
            if (newData.Head == null)
            {
                newData.Head = clone;
            }
            if (Parent is PuppetLevel parentClone)
            {
                parentClone  = parentClone.CloneForReal(newData);
                clone.Parent = parentClone;
            }
            else
            {
                clone.Parent = newData;
            }
            return(clone);
        }
예제 #2
0
        protected PuppetLevel Init(IPuppetLevel parent)
        {
            if (Parent != null)
            {
                throw new InvalidOperationException("Cannot be initialized twice");
            }
            var tmp = parent;

            while (tmp is PuppetLevel casted)
            {
                if (tmp.GetType().IsAssignableFrom(GetType()))
                {
                    throw new ArgumentException("All parents must be of different type");
                }
                tmp = casted.Parent;
            }
            Parent    = parent;
            Data      = (PuppetLevelData)tmp;
            Data.Head = this;
            return(this);
        }