📄 12-3.cs
字号:
//程序12-3
using System;
public delegate string Delegt1(int i);
public delegate void Delegt2();
public delegate void Delegt3(int j);
public class ClasA
{
int privt; //私有数据
protected string [] Ary;
public int getPri
{
get
{
return privt;
}
}
public Delegt2 FromClasB; //在类中声明委托
public Delegt3 ChangeA; //在类中声明委托
public ClasA(){}
public ClasA(int k,string [] a) //构造函数
{
privt=k;
Ary=a;
}
public string MethodA(int i)
{
return Ary[i]+" is in ClasA.";
}
}
public class ClasB
{
int privt;
public int getPri
{
get
{
return privt;
}
}
public void ChangePri(int jj)
{
privt=jj;
}
public string MethodB(int i)
{
return i.ToString()+" is in ClasB.";
}
public void WhoTell()
{
Console.WriteLine("Who can tell me?");
}
public static void WhatDelegt() //静态方法
{
Console.WriteLine("What is the delegate?");
}
}
public class Test
{
public static void CalDelegts(Delegt1 dg,int i) //委托可以作为方法的参数
{
Console.WriteLine(dg(i));
}
public static void Main()
{
string [] Ss={"aa","bb","cc"};
ClasA CA=new ClasA(0,Ss);
ClasB CB=new ClasB();
Delegt1 gfunc = new Delegt1(CA.MethodA); //创建委托,与ClasA中方法关联
Console.WriteLine(gfunc(1));
Delegt2 g2func=new Delegt2(ClasB.WhatDelegt); //创建委托,与静态方法关联
g2func();
CA.FromClasB=new Delegt2(CB.WhoTell); //ClasA中的委托与ClasB中的方法关联
CA.FromClasB(); //调用该委托
CA.FromClasB=new Delegt2(ClasB.WhatDelegt); //ClasA中的委托与ClasB中静态方法关联
CA.FromClasB();
Delegt1 [] Mydlgt =new Delegt1[2]; //利用数组依次调用委托
Mydlgt[0]=new Delegt1(CA.MethodA);
Mydlgt[1]=new Delegt1(CB.MethodB);
foreach(Delegt1 dl in Mydlgt) CalDelegts(dl,2);
CA.ChangeA=new Delegt3(CB.ChangePri); //ClasA的委托与ClasB中方法关联
CA.ChangeA(7); //方法试图改变私有数据
Console.WriteLine(CA.getPri); //改变了ClasA对象的私有数据?
Console.WriteLine(CB.getPri); //改变了ClasB对象的私有数据?改变了,虽然可以动态地决定哪个方法被调用,但是方法的代码是在编译时就被确定的。
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -