C#中is和as、向上强制转换和向下强制装换之详解

来源:互联网 发布:西安爱知 编辑:程序博客网 时间:2024/06/05 07:41

首先,第一个出现的是is,有时,我们需要查看某个类是否实现了一个接口,这个时候就可以使用is关键字来找出答案:

<span style="font-family:SimHei;font-size:18px;">for(int I = 0; i< bees.Length; i++){         if(bees[i] is IWorker){                   //code do something.         }}</span>
注:接口用I开头。

除此之外,使用is不仅可以查看某个类是否实现了一个接口,也可以查看派生了哪个类。在这儿需要注意如果查看派生了哪个类,格式为:powerConsumer is CoffeeMaker,其中powerConsumer是父类的引用,CoffeeMaker是子类。这一点需要注意。

其次,第二个出现的是as,is指出一个对象实现了什么,as告诉编译器如何看待一个对象:

<span style="font-family:SimHei;font-size:18px;">for(int i =0; i< bees.Length; i++){if(bees[i] is IWorker){IWorker thisWorker;thisWorker  = bees[i] as IWorker;thisWorker.dowork();        }}</span>

注意:上例使用as将一个对象看成了其实现的接口时,thisWorker只能使用接口中的方法,不能使用原来类中的方法。

这时,向上强制转换和向下强制转化进入视野。首先来看向上强制转换:用子类代替基类时(比如用一个咖啡机代替家用电器),称为向上强制转换(upcasting),向上强制转换唯一的缺点是,只能使用基类的属性和方法。

例如:Appliance是一个家用电器基类,CoffeeMaker是一个继承自Appliance的子类。声明如下:

<span style="font-family:SimHei;font-size:18px;">Appliance powerConsumer = new CoffeeMaker();powerConsumer.ConsumePower();</span>
解读如下:上述程序可以分解为如下:

<span style="font-family:SimHei;font-size:18px;">Appliance powerConsumer;powerConsumer = new CoffeeMaker();powerConsumer.ConsumePower();</span>

首先程序创建一个Appliance类型的变量名为powerConsumer的引用,这个时候内存中没有任何东西。接着创建一个指向CoffeeMaker的实例对象,将powerConsumer引用指向这个实例对象,此时内存中有了一个CoffeeMaker类的实例对象,但是引用类型为Appliance,此时,使用powerConsumer变量时,将其看作Appliance类型使用,并不是CoffeeMaker,虽然内存中存在的是CoffeeMaker类的实例对象,之所以这样是合理有效的原因是CoffeeMaker继承自Appliance。如下所示,原理一样:

<span style="font-family:SimHei;font-size:18px;">Appliance[] kitchenWare = new Appliance[];kitchenWare[0] = new CoffeeWorker();kitchenWare[1] = new Oven();</span>

有了向上强制转换,那就必须要向下强制转换(downcasting):也就是将先前的向上强制转化引用变回来。可以使用is关键字明确一个Appliance对象是否实际上是一个CoffeeMaker,一旦确定,可以使用as关键字把这个Appliance再变回为一个CoffeeMaker。

<span style="font-family:SimHei;font-size:18px;">if(powerConsumer is CoffeeWorker){        CoffeeWorker javaJoe = powerConsumer as CoffeeWorker;        javaJoe.MakeCoffee();}</span>

到这里,is和as、向上强制转换和向下强制转换讲解完毕,希望对大家有所帮助!



0 0