适配
(
转换
)
的概念无处不在……
适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。
(即编写一个具有所需要的接口的类,然后让它和拥有不同接口的类进行通信)
动机:
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?
意图:
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构——对象适配器:
把原始类包含在新类里,然后在新类里创建方法去转换调用。
结构——类适配器:
从一个不一致的类里派生出一个新类,然后添加需要的方法,使新的派生类能匹配所需要的接口。
Adapter模式的几个要点:
l
Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
l
GoF23定义了两钟Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
l
Adapter模式可以实现的非常灵活,不必拘泥于GoF23中定义的两中结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。
l
Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便地适配。
.NET框架中的Adapter应用
l
在.NET中复用COM对象:
COM对象不符合.NET对象的借口
使用tlbimp.exe来创建一个Runtime Callable Wrapper(RCW)以使其符合.NET对象的接口。
l
.NET数据访问类(Adapter变体):
各种数据库并没有提供DataSet接口
使用DbDataAdapter可以将任何各数据库访问/存取适配到一个DataSet对象上。
l
集合类中对现有对象的排序(Adapter变体):
现有对象未实现IComparable接口
实现一个排序适配器(继承IComparer接口),然后在其Compare方法中对两个对象进行比较
Swimmer.cs代码示例:
using
System;
using
CsharpPats;
namespace
LstAdapter
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Summary description for Swimmer.
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class Swimmer:IComparable ...{
private string name; //name
private string lname, frname;//split names
private int age; //age
private string club; //club initials
private float time; //time achieved
private bool female; //sex
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public Swimmer(string line) ...{
StringTokenizer tok = new StringTokenizer(line,",");
splitName(tok);
age = Convert.ToInt32 (tok.nextToken());
club = tok.nextToken();
time = Convert.ToSingle (tok.nextToken());
string sx = tok.nextToken().ToUpper ();
female = sx.Equals ("F");
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
private void splitName(StringTokenizer tok) ...{
name = tok.nextToken();
int i = name.IndexOf (" ");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(i >0 ) ...{
frname = name.Substring (0, i);
lname = name.Substring (i+1).Trim ();
}
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int CompareTo(object swo) ...{
Swimmer sw = (Swimmer)swo;
return lname.CompareTo (sw.getLName() );
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool isFemale() ...{
return female;
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int getAge() ...{
return age;
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public float getTime() ...{
return time;
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public string getName() ...{
return name;
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public string getClub() ...{
return club;
}
//---------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public string getLName() ...{
return lname;
}
}
}
SwimData.cs代码示例:
using
System;
using
System.Collections ;
using
CsharpPats;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
LstAdapter
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Summary description for SwimData.
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class SwimData:ICloneable ...{
protected ArrayList swdata;
private int index;
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public SwimData() ...{
swdata = new ArrayList ();
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public SwimData(ArrayList swd) ...{
swdata = swd;
index=0;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int count() ...{
return swdata.Count ;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public SwimData(string filename) ...{
swdata = new ArrayList ();
csFile fl = new csFile(filename);
fl.OpenForRead ();
string s = fl.readLine ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while(s != null) ...{
Swimmer sw = new Swimmer(s);
swdata.Add (sw);
s = fl.readLine ();
}
fl.close ();
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public object Clone() ...{
SwimData newsd = new SwimData(swdata);
return newsd;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void moveFirst() ...{
index = 0;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool hasMoreElements() ...{
return (index < swdata.Count-1 );
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void sort() ...{
//sort using IComparable interface of Swimmer
swdata.Sort (0,swdata.Count ,null);
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public Swimmer getSwimmer(int index) ...{
if(index < swdata.Count && index >=0)
return (Swimmer)swdata[index++];
else
return null;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public Swimmer getSwimmer() ...{
if(index < swdata.Count )
return (Swimmer)swdata[index++];
else
return null;
}
}
}
ListAdapter.cs代码示例:
using
System;
using
System.Windows.Forms;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
LstAdapter
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Summary description for ListAdapter.
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class ListAdapter ...{
private ListBox listbox; //operates on this one
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public ListAdapter(ListBox lb) ...{
listbox = lb;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Add(string s) ...{
listbox.Items.Add (s);
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Add(Swimmer sw) ...{
listbox.Items.Add (sw.getName()+" "+sw.getTime());
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int SelectedIndex() ...{
return listbox.SelectedIndex;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Clear() ...{
listbox.Items.Clear ();
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void clearSelection() ...{
int i = SelectedIndex();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(i >= 0) ...{
listbox.SelectedIndex =-1;
}
}
}
}
StringTokenizer.cs代码示例:
using
System;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
CsharpPats
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//String Tokenizer class
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class StringTokenizer ...{
private string data, delimiter;
private string[] tokens;
private int index;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public StringTokenizer(string dataLine) ...{
init(dataLine, " ");
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
private void init(String dataLine, string delim) ...{
delimiter = delim;
data = dataLine;
tokens = data.Split (delimiter.ToCharArray() );
index = 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public StringTokenizer(string dataLine, string delim) ...{
init(dataLine, delim);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool hasMoreElements() ...{
return (index < (tokens.Length));
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public string nextToken() ...{
return nextElement();
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public string nextElement() ...{
string s = tokens[index++];
while((s.Length <=0) && (index<tokens.Length ))
s = tokens[index++];
return s;
}
}
}
CsFile.cs代码示例:
using
System;
using
System.IO ;
namespace
CsharpPats
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// A simple file handlng class
/// </summary>
public class csFile
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
private string fileName;
StreamReader ts;
StreamWriter ws;
private bool opened, writeOpened;
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public csFile() ...{
init();
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
private void init() ...{
opened = false;
writeOpened = false;
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public csFile(string file_name) ...{
fileName = file_name;
init();
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool OpenForRead(string file_name)...{
fileName = file_name;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ...{
ts = new StreamReader (fileName);
opened=true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
catch(FileNotFoundException ) ...{
return false;
}
return true;
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool OpenForRead() ...{
return OpenForRead(fileName);
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public string readLine() ...{
return ts.ReadLine ();
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void writeLine(string s) ...{
ws.WriteLine (s);
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void close() ...{
if (opened)
ts.Close ();
if(writeOpened)
ws.Close();
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool OpenForWrite() ...{
return OpenForWrite(fileName);
}
//-----------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public bool OpenForWrite(string file_name) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
ws = new StreamWriter (file_name);
fileName = file_name;
writeOpened = true;
return true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
catch(FileNotFoundException ) ...{
return false;
}
}
}
}
事件代码:
private
void
init()
...
{
swdata = new SwimData ("swimmers.txt");
lskids= new ListAdapter (lsKids);
lsnewKids = new ListAdapter (lsNewKids);
reload();
}
private
void
reload()
...
{
lskids.Clear ();
swdata.moveFirst ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (swdata.hasMoreElements() ) ...{
Swimmer sw = swdata.getSwimmer ();
lskids.Add (sw.getName() );
}
private
void
btClone_Click(
object
sender, EventArgs e)
...
{
int i = lskids.SelectedIndex ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( i >= 0) ...{
Swimmer sw = swdata.getSwimmer (i);
lsnewKids.Add (sw.getName() +" "+sw.getTime ());
lskids.clearSelection ();
}
}
private
void
btBack_Click(
object
sender, System.EventArgs e)
...
{
reload();
}
private
void
putBack_Click(
object
sender, EventArgs e)
...
{
int i = lsnewKids.SelectedIndex ();
if(i >= 0)
lsNewKids.Items.RemoveAt (i);
}
使用DataGrid
LstAdapter.cs代码示例:
using
System;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
GridAdapt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Summary description for LstAdapter.
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public interface LstAdapter ...{
void Add(Swimmer sw) ;
int SelectedIndex() ;
void Clear() ;
void clearSelection() ;
}
}
GridAdapter.cs代码示例:
using
System;
using
System.Windows.Forms ;
using
System.Data;
namespace
GridAdapt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Summary description for GridAdapter.
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class GridAdapter:LstAdapter ...{
private DataGrid grid;
private DataTable dTable;
private int row;
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public GridAdapter(DataGrid grd) ...{
grid = grd;
dTable = (DataTable)grid.DataSource;
grid.MouseDown +=new System.Windows.Forms.MouseEventHandler (Grid_Click);
row = -1;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Grid_Click(object sender, System.Windows.Forms.MouseEventArgs e) ...{
DataGrid.HitTestInfo hti = grid.HitTest (e.X, e.Y);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(hti.Type == DataGrid.HitTestType.Cell )...{
row = hti.Row ;
}
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Add(Swimmer sw) ...{
DataRow row = dTable.NewRow();
row["Frname"] = sw.getFrname();
row[1] = sw.getLName();
row[2] = sw.getAge(); //This one is an integer
dTable.Rows.Add(row);
dTable.AcceptChanges();
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int SelectedIndex() ...{
return row;
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Clear() ...{
int count = dTable.Rows.Count ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i=0; i< count; i++) ...{
dTable.Rows[i].Delete ();
}
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void clearSelection() ...{}
}
}
事件代码:
private
void
init()
...
{
swdata = new SwimData ("swimmers.txt");
lskids= new ListAdapter (lsKids);
createGrid();
lsNewKids = new GridAdapter (dGrid);
reload();
}
private
void
createGrid()
...
{
dTable = new DataTable("Kids");
dTable.MinimumCapacity = 100;
dTable.CaseSensitive = false;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
DataColumn column =
new DataColumn("Frname",System.Type.GetType("System.String"));
dTable.Columns.Add(column);
column = new DataColumn("Lname", System.Type.GetType("System.String"));
dTable.Columns.Add(column);
column = new DataColumn("Age", System.Type.GetType("System.Int16"));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dTable.Columns.Add(column);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dGrid.DataSource = dTable;
dGrid.CaptionVisible = false; //no caption
dGrid.RowHeadersVisible = false; //no row headers
dGrid.EndInit();
}
private
void
reload()
...
{
lskids.Clear ();
swdata.moveFirst ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (swdata.hasMoreElements() ) ...{
Swimmer sw = swdata.getSwimmer ();
lskids.Add (sw.getName() );
}
private
void
btClone_Click(
object
sender, System.EventArgs e)
...
{
int i = lskids.SelectedIndex ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( i >= 0) ...{
Swimmer sw = swdata.getSwimmer (i);
lsNewKids.Add (sw);
lskids.clearSelection ();
}
}
private
void
btBack_Click(
object
sender, System.EventArgs e)
...
{
reload();
}
使用TreeView
TreeAdapter.cs代码示例:
using
System;
using
System.Windows.Forms;
namespace
TreeAdapt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Summary description for TreeAdapter.
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class TreeAdapter:LstAdapter ...{
private TreeView tree;
//------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public TreeAdapter(TreeView tr) ...{
tree=tr;
}
//------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Add(Swimmer sw) ...{
TreeNode nod;
//add a root node
nod = tree.Nodes.Add(sw.getName());
//add a child node to it
nod.Nodes.Add(sw.getTime().ToString ());
tree.ExpandAll ();
}
//------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public int SelectedIndex() ...{
return tree.SelectedNode.Index ;
}
//------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Clear() ...{
TreeNode nod;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for (int i=0; i< tree.Nodes.Count ; i++) ...{
nod = tree.Nodes [i];
nod.Remove ();
}
}
//------
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void clearSelection() ...{}
}
}
事件代码:
private
void
init()
...
{
swdata = new SwimData ("swimmers.txt");
lskids= new ListAdapter (lsKids);
lsNewKids = new TreeAdapter (Tree);
reload();
}
private
void
reload()
...
{
lskids.Clear ();
swdata.moveFirst ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (swdata.hasMoreElements() ) ...{
Swimmer sw = swdata.getSwimmer ();
lskids.Add (sw.getName() );
}
}
private
void
btClone_Click(
object
sender, System.EventArgs e)
...
{
int i = lskids.SelectedIndex ();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( i >= 0) ...{
Swimmer sw = swdata.getSwimmer (i);
lsNewKids.Add (sw);
lskids.clearSelection ();
}
}
private
void
btBack_Click(
object
sender, System.EventArgs e)
...
{
reload();
}
类适配器
using
System;
using
System.Collections;
using
System.ComponentModel;
using
System.Drawing;
using
System.Data;
using
System.Windows.Forms;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
ClassAdapt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class MyList : System.Windows.Forms.ListBox, ListAdapter ...{
private System.ComponentModel.Container components = null;
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public MyList() ...{
InitializeComponent();
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Add(string s) ...{
this.Items.Add (s);
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Add(Swimmer sw) ...{
this.Items.Add (sw.getName() +
" " + sw.getAge ().ToString () );
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void Clear() ...{
this.Items.Clear ();
}
//-----
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void clearSelection() ...{
this.SelectedIndex = -1;
}
protected override void Dispose( bool disposing )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if( disposing )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(components != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
components.Dispose();
}
}
base.Dispose( disposing );
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
Component Designer generated code#region Component Designer generated code
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
components = new System.ComponentModel.Container();
}
#endregion
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)