用序列化方法实现的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());
                        
                
        }
} 
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号