当前位置: 首页 > news >正文

C# 原型模式(C#中的克隆)

C#中的克隆

克隆(Clone)一个类实例(完全拷贝)的思想不是C#的固有属性,但也没有什么理由可以阻
止你自己完成这样的操作。克隆方法出现在C#中的惟一地方是在ADO Dataset处理里。读者可以
创建一个DataSet作为数据库查询的结果,其行指针可以一次移动一行。如果出于某种原因,需要
把索引保持在DataSet的两个位置上,就需要两个“当前行”。C#处理这种情况的最简单方法是克
隆DataSet。

DataSet cloneSet;
cloneSet=myDataSet.Clone();

这种方法并不产生数据的两个拷贝,它只生成两套行指针,用于在记录之间相互独立地移动。
因为实际上只有一个数据表,所以,DataSet的一个克隆体中的任何改变,都会立即反映到另一个
克隆体中。我们在下面的例子中会讨论一个与此类似的问题。

使用原型

我们接下来编写一个简单的程序,从数据库读人数据,然后克隆结果对象。在这个例子中,与
前面的论述一样,原始数据是从一个大数据库中导出来的,而我们只是从一个文件读人数据。文件
具有如下格式:

Kristen Frost, 9, CAT, 26.31, F 
Kimberly Watcke, 10, CDEV, 27.37, F 
Jaclyn Carey, 10, ARAC, 27.53, F 
Megan Crapster, 10, IEHY, 27.68, F 

这里要用到先前开发的csFiIe类。首先,创建一个Swimmer类,它包含一个运动员的名字、
俱乐部名字、性别和时间(即成绩),使用第4章开发的csFile类和StringTokenizer类读入这些
数据。

public class Swimmer
{private string name;private string lname,frname;private int age;private string club;private float time;private bool female;public Swimmer(string line){StringTokenizer tok=new StringTokenizer(line,",");spliteName(tok);age=Convert.ToInt32(tok.nextToken());club=tok.nextToken();time=Convert.ToSingle(tok.nextToken());string sx=tok.nextToken().ToUpper();female=sx.Equals("F");}private void spliteName(StringTokenizer tck){name=tok.nextToken();int i=name.IndexOf(" ");if(i>0){frname=name.Substring(0,i);lname=name.Substring(i+1).Trim();}}public bool isFemale(){return female;}public int getAge(){return age;}public float getTime(){return time;}public string getName(){return name;}public string getClun(){return club;}
}

接下来创建一个SwimData类,它包含一个从数据库读人的swimmer对象的ArrayList。

public class SwimData
{protected ArrayList swdata;private int index;public SwimData(){swdata=new ArrayList();}public SwimData(ArrayList swd){swdata=swd;index=0;}public SwimData(string filename){swdata=new ArrayList();csFile f1=new csFile(filename);fl.openForRead();string s=fl.readLine();while(s!=null){Swimmmer sw=new Swimmmer();swdata.Add(sw);s=fl.readLine();}fl.close();}public void moveFirst(){index=0;}public bool hasMoreElements(){return(index<swdata.Count-1);}public void sort(){}public Swimmmer getSwimmer(){if(index<swdata.Count)return (Swimmmer)swdata[index++];else return null;}
}

然后,就可以使用该类读人选手数据,并把它们显示在列表框中。

private void init()
{swdata=new SwimData("swimmers.txt");reload();
}private void reload()
{lsKids.Items.Clear();swdata.moveFirst();while(swdata.hasMoreElements()){Swimmer sw=swdata.getSwimmer();lsKids.Items.Add(sw.getName());}
}

单击“一>”按钮,克隆Swata类,并在新类中对数据进行不同的排序。因为创建一个新的
类实例会比较慢,而且我们想以两种形式保存数据,所以也对数据进行了克隆。

private void btClone_Click(object sender,EventArgs e)
{SwimData newSd=(SwimData)swdata.Clone();newSd.Sort();while(newSd.hasMoreElements()){Swimmer sw=(Swimmer)newSd.getSwimmer();lsNewKids.Items.Add(sw.getName());}
}
http://www.dtcms.com/a/362889.html

相关文章:

  • 基因表达数据的K-M生存曲线的数据处理及绘制
  • Anaconda安装与使用详细教程
  • 服务器CPU飙高?排查步骤与工具推荐
  • 深入探索 HarmonyOS Stage 模型与 ArkUI:构建现代化、高性能应用
  • 【NestJS】HTTP 接口传参的 5 种方式(含前端调用与后端接收)
  • 面试新纪元:无声胜有声,让AI成为你颈上的智慧伙伴
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 利用飞算Java打造电商系统核心功能模块的设计与实现
  • Controller返回CompletableFuture到底是怎么样的
  • 【DSP28335 入门教程】定时器中断:为你的系统注入精准的“心跳”
  • 在windows平台oracle 23ai 数据库上使用bbed
  • zephyr设备树的硬件描述转换为c语言
  • 梳理一下 @types/xxx
  • 【Python语法基础学习笔记】竞赛常用标准库
  • 数据库的锁级别
  • Git在idea中的实战使用经验(一)
  • 深度学习之第五课卷积神经网络 (CNN)如何训练自己的数据集(食物分类)
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • FlowGPT-GPT提示词分享平台
  • 深入剖析Java设计模式之策略模式:从理论到实战
  • 【音视频】 WebRTC GCC 拥塞控制算法
  • 从Java全栈到前端框架:一场真实的技术面试实录
  • Leetcode二分查找(5)
  • 【算法】哈希表专题
  • 单元测试总结2
  • 【大前端】Vue 和 React 主要区别
  • dy图文批量下载
  • 【C++】模板(初阶)--- 初步认识模板
  • 从一行 var a = 1 开始,深入理解 V8 引擎的心脏
  • 【Linux我做主】进程退出和终止详解