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

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.xdnf.cn/news/19803.html

相关文章:

  • “转”若惊鸿,电磁“通”——耐达讯自动化RS485转Profinet点亮能源新章
  • 【NestJS】HTTP 接口传参的 5 种方式(含前端调用与后端接收)
  • 【卷积神经网络】卷积神经网络的三大核心优势:稀疏交互、参数共享与等变表示
  • C++之基于正倒排索引的Boost搜索引擎项目介绍
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘black’问题
  • 【提示词】...(后续单元)在Prompt 的作用
  • 【linux仓库】万物至简的设计典范:如何用‘文件’这一个概念操纵整个Linux世界?
  • 在Docker中安装MySQL时3306端口占用问题
  • 论文学习30:LViT: Language Meets Vision Transformerin Medical Image Segmentation
  • 使用云手机进行游戏搬砖划算吗?
  • 国内真实的交换机、路由器和分组情况
  • 【保姆级喂饭教程】把chrome谷歌浏览器中的插件导出为CRX安装包
  • LeetCode 925.长按键入
  • 数据结构:希尔排序 (Shell Sort)
  • 【51单片机】【protues仿真】基于51单片机呼叫系统
  • 基于Force-closure评估的抓取计算流程
  • 生成知识图谱与技能树的工具指南:PlantUML、Mermaid 和 D3.js
  • 【AI报表】JimuReport 积木报表 v2.1.3 版本发布,免费可视化报表和大屏
  • 【leetcode】222. 完全二叉树的节点个数
  • Altium Designer中的Net-Tie:解决多网络合并与电气隔离的利器
  • CPTS-Vintage 票据,基于资源的约束委派 (RBCD),DPAPI密钥
  • 自制扫地机器人(二) Arduino 机器人避障设计——东方仙盟
  • Veo Videos Generation API 对接说明
  • 鸿蒙NEXT表单选择组件详解:Radio与Checkbox的使用指南
  • 开源 C++ QT Widget 开发(十)IPC进程间通信--共享内存
  • 零跑汽车8月交付57066台,同比增长超88%
  • amd cpu是x86架构吗
  • 【Audio】静音或振动模式下重复来电响铃
  • stdexcept介绍与使用指南
  • 【LeetCode】3670. 没有公共位的整数最大乘积 (SOSDP)