zoukankan      html  css  js  c++  java
  • 用序列化方法实现的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());
                           
                   
            }
    }

  • 相关阅读:
    struts 2.1.8.1的sx:datetimepicker标签出现NaN错误的原因和解决办法
    php windows与linux下的路径区别
    php递归删除文件夹
    php ffmpeg截取视频第一帧保存为图片的方法
    mysql group by使用方法注意
    PHP更新用户微信信息的方法
    PHP file_get_contents 读取js脚本的问题
    javascript采用Broadway实现安卓视频自动播放的方法(这种坑比较多 不建议使用)
    html5 textarea 写入换行的方法
    jquery swiper3自定义切换效果的方法
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/347122.html
Copyright © 2011-2022 走看看