• 用序列化方法实现的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());
                           
                   
            }
    }

  • 相关阅读:
    WPF-ListView单元格设置文字换行
    WPF-GridView设置列宽按比例分配
    C#控制台输入密码星号显示
    安装pycharm
    超强的链接2
    redis
    day 46 htmljianjie
    day45 html超文本标记语言
    43 非阻塞 io多路复用
    42 队列 线程池 协程 geven模块 协程完成的socket
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/347122.html
Copyright © 2020-2023  润新知