下面是上次写的一个用序列化方法实现的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());
}
}