4.类转化is和关键字as
Is运算符来检查用户自定义的类类型的使用方法。
As运算符的功能与强制类型的转换类似,可以将一个对象强制转换为另一个类型。as格式如下: 变量 as 数据类型 示例代码和运行结果如下:
namespace InterfaceTest {
classTestisas { }
publicclassPerson {
publicstring name; public Person() { } public Person(string na) { this.name = na; }
publicvirtualvoid Showname() {
Console.Write(\, name); } }
publicclassEmployee : Person {
publicshort hireyear;
public Employee() : base() { }
public Employee(string i) : base(i) { } publicoverridevoid Showname() {
Console.Write(\, name); } }
publicclassManager : Person {
publicshort hireyear; public Manager() : base() { }
public Manager(string i) : base(i) { } publicoverridevoid Showname() {
Console.Write(\, name); } }
publicclassApp {
publicstaticvoid Main() {
Person[] pp = newPerson[3]; for (int i = 0; i != 3; ++i) {
Console.WriteLine(\); string ee=Console.ReadLine(); if (ee == \ || ee == \) {
Console.WriteLine(\); Manager mag = newManager(Console.ReadLine()); pp[i] = mag asPerson; } else
{
if (ee == \ || ee == \) {
Console.WriteLine(\); Employee emp = newEmployee(Console.ReadLine()); pp[i] = emp asPerson; }
else
{ --i; } }
}
for (int i = 0; i != 3; ++i) { if (pp[i] isManager) {
Console.WriteLine(\+pp[i].name); } if (pp[i] isEmployee) {
Console.WriteLine(\ + pp[i].name); } } //{
// pp[i].Showname(); // Console.WriteLine(\//}
Console.ReadLine(); } } }
5. 代理和多重代理
C#中的代理作用类似于C/C++中的函数指针,代理同接口一样,也是一种引用类型。用关键字delegate定义一个代理,格式如下:
[代码属性] [修饰符] delegate 返回类型 代理名 ([形式参数列表])
由于代理是封闭的,所以不可以派生出新的代理。代理的最大作用是它可以在运行期间决定调用哪个方法,并且不但可以调用对象的实例化方法,还可以调用类的静态方法。 代理与接口在使用上有所不同:当调用单一方法或要为指定的标识和返回类型实现一些方法的时候,通常使用代理;而接口用于声明多个带有不同的标识和返回类型的相关方法。 多重代理:首先创建将要调用的代理实例,并向该实例的调用链表中添加其他代理实例,最后显示代理实例的调用链表,并通过代理实例来调用方法。
使用多重代理的唯一限制是:方法链表中的方法必须具有相同的参数,并且这些方法的返回类型必须定义为void。 使用代理的步骤:
1)先定义代理名并指出调用的方法需要传递的参数
2)实例化此代理,并指出调用的方法 3)调用格式:实例化对象(需传参数)
实例代码和结果如下:
namespace InterfaceTest {
delegatevoidMyDelegate(); classDelegateTest {
publicstaticvoid StMethod1() {
Console.WriteLine(\调用第一个静态方法.\); }
publicstaticvoid StMethod2() {
Console.WriteLine(\调用第二个静态方法.\); }
publicvoid InsMethod1() {
Console.WriteLine(\调用第一个实例方法.\); }
publicvoid InsMethod2() {
Console.WriteLine(\调用第二个实例方法.\); } }
classApppp {
staticvoid PlayDelegate(MyDelegate d)
{
Console.WriteLine(\代理{0}的调用链表为:\, d); Delegate[] cc = d.GetInvocationList(); for (int i = 0; i != cc.Length; ++i) {
Console.WriteLine(\第{0}个元素的目标为:{1}\, i, cc[i].Target == null ? \ : cc[i].Target); Console.WriteLine(\调用方法为:{0}\, cc[i].Method); }
Console.WriteLine(\当前的目标为{0},调用方法为{1}\, d.Target == null ? \ : d.Target, d.Method); }
staticvoid Main() {
MyDelegate myde = newMyDelegate(DelegateTest.StMethod1); myde += newMyDelegate(DelegateTest.StMethod2); DelegateTest dt = newDelegateTest();
myde += newMyDelegate(dt.InsMethod1); myde += newMyDelegate(dt.InsMethod2);
PlayDelegate(myde); Console.WriteLine();
Console.WriteLine(\代理实例调用的方法有:\); myde(); Console.ReadLine();
} } }