用序列化方法实现的Prototype的深拷贝

下面是上次写的一个用序列化方法实现的Prototype的深拷贝代码,可供大家参考——注意其中Clone方法不是虚方法,写一次就可以满足所有子类的需要:

using System;
using System.Runtime;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

//抽象原型
[Serializable]
public abstract class Prototype
{
        public abstract int I
        {
                get;
                set;
        }

        public abstract string S
        {
                get;
                set;
        }

        public abstract int[] A
        {
                get;
                set;
        }
        public abstract void print();
        public Prototype Clone()
        {

                MemoryStream stream = new MemoryStream();

                BinaryFormatter formatter = new BinaryFormatter();

                formatter.Serialize(stream, this);

                stream.Position = 0;

                return (Prototype)formatter.Deserialize(stream);

        }
}


[Serializable]
public class ConcretePrototype : Prototype
{
        public int i;
        public string s;
        public int[] a;

        public override int I
        {
                get { return i; }
                set { this.i = value; }
        }

        public override string S
        {
                get { return s; }
                set { this.s = value; }
        }

        public override int[] A
        {
                get { return a; }
                set { this.a = value; }
        }

        public override void print()
        {
                Console.Write("i={0}, s={1}, a={2}", i, s, a);
                foreach (int item in a) { Console.Write(item+","); }
                Console.WriteLine();

        }

}


public class GameSystem
{
        public void Run(Prototype prototype)
        {
                Prototype item1 = prototype.Clone();
                item1.I = 100;
                item1.S = "hello";
                item1.A = new int[] { 1, 2, 3 };

                Prototype item2 = prototype.Clone();

                item2.I = 400;
                item2.S = "world";
                item2.A = new int[] { 100, 200, 300 };

                item1.print();
                item2.print();
                Console.WriteLine(item1);
        }

}

class App
{
        public static void Main()
        {
                GameSystem gameSystem=new GameSystem();

                gameSystem.Run(new ConcretePrototype());
                       
               
        }
}

posted @ 2006-03-10 13:19  kuailewangzi1212  阅读(283)  评论(0编辑  收藏  举报